Почему подготовленный оператор php не работает, если передать параметр по индексу массива? - PullRequest
0 голосов
/ 19 мая 2019

почему это не возвращает строку mysql:

$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $array[0]);
$array = array(1);
$sql -> execute();

но когда я помещаю массив перед bind_param, это работает. как это:

$sql = $conn -> prepare("select * from table where id = ?");
$array = array(1);
$sql -> bind_param('i', $array[0]);
$sql -> execute();

или

$array = array(1);
$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $array[0]);
$sql -> execute();

Ответы [ 2 ]

1 голос
/ 20 мая 2019

mysqli_statement::bind_param($types, &$var1) принимает переменные по ссылке. Таким образом, предназначен для работы с переменными, которые еще не определены .

И обычно вы можете сделать это

$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $i);
$i = 1;
$sql -> execute();

и это будет работать безупречно.

Однако, массив - это другое дело. Как отмечено в комментарии @mario, ссылка на необъявленную переменную автоматически определяет ее. Таким образом, когда вы ссылаетесь на переменную (а здесь $sql->bind_param('i', $array[0]); вы фактически делаете это), будут созданы и $array, и $array[0]. Где $array[0] является ссылкой.

Если бы вы присвоили значение этой переменной, т. Е. $array[0] = 1;, это сработало бы.
Но вы присвоили новое значение всему массиву . В результате теперь он содержит не ссылку, а новое значение.

Сказанное выше можно проиллюстрировать с помощью простого кода

Как видите, до тех пор, пока вы сохраняете оригинальный элемент массива, ссылка остается.
Но как только вы присваиваете новое значение всему массиву, ссылка исчезает!

Но оно ушло только из массива, а не из функции. Там он все еще указывает на это нечетное значение &NULL. Вот почему вы не можете получить какой-либо результат.

0 голосов
/ 19 мая 2019

поделился своими мыслями в комментариях

$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $array[0]);// undefined since $array is not yet defined
$array = array(1);// you've just defined it here
$sql -> execute();
$sql = $conn -> prepare("select * from table where id = ?");
$array = array(1);// you have defined it first
$sql -> bind_param('i', $array[0]);// PHP will know $array, since you've defined it in the row above
$sql -> execute();

надеюсь, это поможет!

если что-то неясно, пожалуйста, дайте мне знать!

...