powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Массив значений -> в отдельные параметры функций
11 сообщений из 11, страница 1 из 1
(PHP) Массив значений -> в отдельные параметры функций
    #33084513
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
Привет. Подскажите, как решить такую проблему.
У меня есть массив значений, которые я хочу использовать в функции ibase_execute. Если массив маленький, то можно вручную перечислить все его аргументы, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$dbh = ibase_connect($host, $username, $password);
$query = ibase_prepare($dbh, "UPDATE FOO SET BAR = ? WHERE BAZ = ?");
//есть массив с значениями.
$arr = array( 12 , 13 );
// 1 . можно сделать так
list($bar, $baz) = $arr;
//и подставить в функцию
ibase_execute($query, $bar, $baz);
// 2 . или просто перечислить элементы
ibase_execute($query, $arr[ 0 ], $arr[ 1 ]);
А что делать, когда параметров в запросе (соответственно в массиве значений) 200 и больше(реальная задача)? Писать вручную все элементы - упаришься, просто подставить массив в функцию в качестве аргументов - не получается (и это понятно - PHP ждет например 10 аргументов, а получает один массив). Ругается словами типа:
Код: plaintext
1.
[function.ibase-execute]: Statement expects 2 arguments, 1 given
Итого, можно ли каким-либо способом разбить массив на значения для подстановки в функцию и при этом не перечислять эти переменные? Спасибо.
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084579
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цикл...?
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084628
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GDRА что делать, когда параметров в запросе (соответственно в массиве значений) 200 и больше(реальная задача)?
Честно говоря, очень сомневаюсь, что такая задача реальна. По крайней мере такое решение уж точно не будет оптимальным и стоит пересматривать сам запрос.
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084682
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
2 Berkut - задача реальная - обработка данных статистики и запись в БД. Так что не сомневайтесь.
2 ScareCrow - а чем цикл поможет. Хотя я сейчас гляжу в сторону eval(), т.е. формирование полной строки вызова функции, но не с переменными-аргументами, а ее значением и последующий вызов eval с этой строкой. Пока не попробовал, но должно работать. Правда по мне это не выход :(.
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084718
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
Попробовал сделать с помощью eval() - работает. Не думал правда, что для решения этой задачи придется использовать такие извращения. Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
$dbpath = 'localhost:D:\Test.FDB';
$dblogin = "SYSDBA";
$dbpassword = "masterkey";
$dbrole = "";
$dbcharset = "WIN1251";
$ibdatabase = ibase_connect($dbpath, $dblogin, $dbpassword, $dbcharset) or die("Ошибка в подключениии к $dbpath");//соединяемся с БД
$trans = ibase_trans(IBASE_WRITE,$ibdatabase);//стартуем транзакцию на запись
$ibquery = ibase_prepare($ibdatabase,"insert into test_table (date_e, time_e) values (?,?)");//Это пример. Аргументов у меня гораздо больше = числу полей =  200 
$arr = array('12.10.2001','10:00');//Соответственно массив тоже большой
$params = '';
for ($i= 0 ;$i<count($arr);$i++){
  if ($i!= (count($arr)- 1 )){
   $params.= '\''.$arr[$i].'\',';//значения массива возьмем в кавычки
  }
  else{
   $params.= '\''.$arr[$i].'\'';
  }
}
echo $params;//Будет '12.10.2001','10:00'
$str = '$r = ibase_execute($ibquery,'.$params.');';
eval($str);
ibase_commit($ibdatabase);
ibase_close ($ibdatabase);
Вот и все.
Формирование параметров из массива, формирование строки и вызов eval() можно поместить в цикл по строкам массива $arr.
Как вариант - можно было формировать тело самого запроса вместе с параметрами. Но тогда бы проиграли в скорости выполнения запроса. В предложенном случае prepare + eval() для многочисленных вызовов я думаю будет быстрее.
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084866
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
GDR$params.= '\''.$arr[$i].'\'';
...
$str = '$r = ibase_execute($ibquery,'.$params.');';
eval($str);Не будет работать, если в $arr[$i] будет находиться символ '.
А вообще я бы начал с ознакомления со всеми функциями ibase и прочтением комментариев пользователей - довольно часто там можно найти решение своей проблемы.
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084871
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда можно предложить такой вариант (первое, что в голову прилетело):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?php
$array = array( 3 ,  4 , "'string'",  0 , "'03.02.2005'");         // список параметров

$query = "update into TABLE values (";                 // строка запроса

$query.= implode(", ", $array). ')';

echo $query;

// выводит update into TABLE values ( 3 ,  4 , 'string',  0 , '03.02.2005')
?>

...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33084877
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GDR

Не знаю, то или нет? :)
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33085051
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
2 * - действительно, если в массиве будет присутствовать . (точка), то действительно будет косяк. Но у меня в массиве точек нет - только целые числа (не дробные).
2 Berkut - то-то оно то, но я писал про ibase_prepare(), а это значит, что формируется тело запроса, вместо параметров ставятся ?, делается ibase_prepare() этого запроса, после чего в цикле делается ibase_execute() с подсовыванием этой функции параметров. Все это нужно для того, чтобы ускорить процесс выполнения и чтобы сервер не делал лишних операций по разбору запроса (если запрос одинаковый, а меняются лишь параметры). Наверное ты это и без меня знаешь.
Найденный вариант решения с использованием eval() - рабочий, проверял. Но видимо придется что-то переделать или использовать специфику сервера (для знакомых с IB/FB - думаю ХП меня выручит), т.к. не все устраивает.
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33085119
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
GDR2 * - действительно, если в массиве будет присутствовать . (точка), то действительно будет косяк. Но у меня в массиве точек нет - только целые числа (не дробные).Точка здесь не при чём - я говорил о кавычке (одинарной). Впрочем, если речь идёт лишь о цифрах - тогда да, по барабану. Однако в плане безопасности рано или поздно подобный подход может привести к случайной дыре.Найденный вариант решения с использованием eval() - рабочий, проверял. Но видимо придется что-то переделать или использовать специфику сервера (для знакомых с IB/FB - думаю ХП меня выручит), т.к. не все устраивает.Мне лично тоже вариант с eval не нравится - но к сожалению в IB/FB и взаимодействии с ним на PHP не шарю совершенно - а то бы мож чего подсказал ;)
...
Рейтинг: 0 / 0
(PHP) Массив значений -> в отдельные параметры функций
    #33085393
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GDR2 * - действительно, если в массиве будет присутствовать . (точка), то действительно будет косяк. Но у меня в массиве точек нет - только целые числа (не дробные).
2 Berkut - то-то оно то, но я писал про ibase_prepare(), а это значит, что формируется тело запроса, вместо параметров ставятся ?, делается ibase_prepare() этого запроса, после чего в цикле делается ibase_execute() с подсовыванием этой функции параметров. Все это нужно для того, чтобы ускорить процесс выполнения и чтобы сервер не делал лишних операций по разбору запроса (если запрос одинаковый, а меняются лишь параметры). Наверное ты это и без меня знаешь.
Найденный вариант решения с использованием eval() - рабочий, проверял. Но видимо придется что-то переделать или использовать специфику сервера (для знакомых с IB/FB - думаю ХП меня выручит), т.к. не все устраивает.
К сожалению (или к счастью), ни разу не сталкивался Interbase'ом, поэтому ничего сказать не могу.
Что касается повторного разбора запроса, то конечно согласен. :)

Удачи!

P.S. Все-таки интересно, что это за "зверь" такой, где нужно передавать 200 параметров.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Массив значений -> в отдельные параметры функций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]