SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.12.2008 14:10:08

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Массив

Подскажите как можно поступить если в процедуру нужно передавать что то вроде массива, ну типа arr[0]='Таблетки по 50мг' , arr[1]='Таблетки по 100мг' и т.д. , что бы потом через for вызывать соответствующий insert

Неактивен

 

#2 26.12.2008 14:19:29

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

Никак. Но можете сделать временную табличку, которая будет использоваться этой процедурой.

Неактивен

 

#3 26.12.2008 14:38:08

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

paulus написал:

Никак. Но можете сделать временную табличку, которая будет использоваться этой процедурой.

ТО есть Временная таблица, туда допустим я загнал массив $arr[n], у меня будет значит во временной таблице n-строк, потом я к этои таблицы оброщяюсь из процедура и FOR-м делаю insert , я правельно понял?

Неактивен

 

#4 26.12.2008 15:31:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

Ну или просто INSERT SELECT smile

Неактивен

 

#5 26.12.2008 15:40:26

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

paulus написал:

Ну или просто INSERT SELECT smile

INSERT SELECT ??? Первый раз слышу)) Щя пороюсь. Спасибо!

Неактивен

 

#6 26.12.2008 15:43:57

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

Ну ваще, жизнь еще легче стала)

Неактивен

 

#7 06.01.2009 16:09:10

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: Массив

В принципе в ХП массив из клиента загнать не проблема.
for и т.п. естественно на клиенте лучше сделать - на кой делать пачку инсертов если можно сделать один инсерт пачки записей.

см. в конце топика
http://sqlinfo.ru/forum/viewtopic.php?id=363

Неактивен

 

#8 13.01.2009 23:33:27

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

EugeneTM написал:

В принципе в ХП массив ИЗ КЛИЕНТА загнать не проблема.

Что то из ПХП терь не получаеться загнать, все делаю как в топе!


CREATE DEFINER=`root`@`localhost` PROCEDURE `test_ins`(ins_val varchar(21000))
begin
set @var = concat('insert into test1 values', ins_val);
prepare zxc from @var;
execute zxc;
end;

из клиента так :


set @stri="(1,'privet'),(2,'poka')";
call test_ins(@stri);
 

все работает!

Из ПХП так:


<?PHP
$link = mysql_connect("localhost","root","");
$dbname = "test";
mysql_select_db($dbname, $link);


$query = 'DELIMITER ; set @stri="(1,\'privet\'),(2,\'poka\')"; call test_ins(@stri);';

$res = mysql_query($query);

echo $query;
?>
 

Не хочет ((

Неактивен

 

#9 14.01.2009 10:20:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

А зачем в PHP Вы используете слово DELIMITER? Оно же клиентское...
mysql_query ("set @stri="(1,\'privet\'),(2,\'poka\')");
mysql_query ("call test_ins(@stri)");

Неактивен

 

#10 14.01.2009 11:01:41

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

paulus написал:

А зачем в PHP Вы используете слово DELIMITER? Оно же клиентское

Я и так и без него тож пробовал!

Неактивен

 

#11 14.01.2009 12:44:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

Так, как я написал? Два запроса отдельно?

Неактивен

 

#12 14.01.2009 12:46:43

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

paulus написал:

Так, как я написал? Два запроса отдельно?

Да.

Неактивен

 

#13 14.01.2009 12:51:01

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

Я уже и вот так пробовал:


create procedure test_ins1()
begin
select 1+1;
end;
 


В ПХП так:


<?php

include("modules/config.php");
$query="call test_ins1 ()";
$result=mysql_query($query);

if(mysql_error()) {
echo mysql_error();
}

?>
 


выдает ошибку:
PROCEDURE test.test_ins1 can't return a result set in the given context

делаю show procedure status все на месте.

Неактивен

 

#14 14.01.2009 13:12:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Массив

Это ограничение клиентских функций. Используйте mysqli_ вместо mysql, см. тему. http://sqlinfo.ru/forum/viewtopic.php?id=551

Неактивен

 

#15 14.01.2009 13:23:43

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

rgbeast написал:

Это ограничение клиентских функций. Используйте mysqli_ вместо mysql, см. тему. http://sqlinfo.ru/forum/viewtopic.php?id=551

Как в мануале делаю:


<?php


$link = mysqli_connect(
            'localhost',
            'root',    
            'root',  
            'test');  

if (!$link) {
   printf("Error %s\n", mysqli_connect_error());
   exit;
}


if ($result = mysqli_query($link, 'SELECT * FROM test1')) {

    print("Very big:\n");

   
    while( $row = mysqli_fetch_assoc($result) ){
        printf("%s (%s)\n", $row['numfld'], $row['strfld']);
    }

   
    mysqli_free_result($result);
}


mysqli_close($link);
?>

 


выдает ошибку:
Call to undefined function mysqli_connect() in C:\

Неактивен

 

#16 14.01.2009 13:26:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Массив

Должно быть установлено расширение mysqli у хостера

Неактивен

 

#17 14.01.2009 13:37:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Массив

Другой вариант - использовать процедуру, которая ничего не возвращает, тогда ее можно выполнять из mysql_query();

Неактивен

 

#18 14.01.2009 14:03:42

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

Если допустим у меня в SP-е есть такая строка:

select count(*) into @somevar from XXX;

так же нужно improved расширение?

Неактивен

 

#19 14.01.2009 14:07:47

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Массив

Должно сработать в mysql_query(). Попробуйте.

Неактивен

 

#20 14.01.2009 14:29:35

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

Не хочет)
Код SP:
delimiter //
Create procedure some_sp(num int, str varchar(255))
begin
insert into test1 values (num,str);
end;
//


Код PHP такой:
<?php
include("modules/config.php");
$first = 1;
$second = "asd";

$query = "call some_sp(1,'$second')";

?>

Извините опечатка))

Отредактированно Ovosh (14.01.2009 15:14:46)

Неактивен

 

#21 14.01.2009 15:56:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

а вызвать?

Неактивен

 

#22 14.01.2009 17:05:24

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

paulus написал:

а вызвать?

да забыл напечатать) Но все равно не работает!
Что делать, я понятия не имею как соберать с поддержкой mysqlI

Неактивен

 

#23 14.01.2009 19:24:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

А сервер Ваш или у хостера какого-то?

Неактивен

 

#24 14.01.2009 21:51:23

Ovosh
Участник
Зарегистрирован: 16.12.2008
Сообщений: 17

Re: Массив

Интересная вещь!
На работе выше пример не работал, в домои пришол с горя потыкал и все заработало!
Хотя установку делал с одного HOWTO!
На работе локальный сервер ОСЬ WindowsXP, apache_2.0.50-win32-x86-no_ssl, mysql-5.0.67-win32, php - 5. И дома это же стоит!

Неактивен

 

#25 15.01.2009 20:24:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Массив

Подземный стук? smile
Настройки посравнивайте еще.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson