Нужно ли всегда определять подготовленную переменную оператора в global? - PullRequest
2 голосов
/ 29 января 2012

У меня есть функция ниже для подготовки и выполнения и возврата результата. я вызываю его, чтобы подготовить мой запрос вставки и привязать к нему значение и вернуть выполненный результат. но когда я проверяю количество затронутых строк вне области действия функции, это дает мне -1, однако моя ожидаемая запись вставляется в мою таблицу.

function prepare_and_run($link,$query_structure){
    $stmt = mysqli_prepare($link,$query_structure);
    mysqli_stmt_bind_param($stmt, 's', 'a string value');
    mysqli_stmt_execute($stmt);
    $result=mysqli_stmt_get_result($stmt);
    if($result===false && !mysqli_errno($link)) 
        return true;
    return $result;
}
//call the function above
$link=mysqli_connect(...);
$result=prepare_and_run($link,"insert into table values(?)");
echo mysqli_affected_rows($link); // output: -1 !!!

Я добавил 3 строки в код и увидел, что это исправлено:

$dpq_stmt=null;  // it is added
function prepare_and_run($link,$query_structure){
    $stmt = mysqli_prepare($link,$query_structure);
    mysqli_stmt_bind_param($stmt, 's', 'a string value');
    mysqli_stmt_execute($stmt);
    global $dpq_stmt; // it is added
    $dpq_stmt=$stmt;  // it is added
    $result=mysqli_stmt_get_result($stmt);
    if($result===false && !mysqli_errno($link)) 
        return true;
    return $result;
}
//call the function above
$link=mysqli_connect(...);
$result=prepare_and_run($link,"insert into ...");
echo mysqli_affected_rows($link); // output: 1 . it is correct

а почему? Должны ли мы всегда определять подготовленную переменную оператора в global?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2017

поздно, но давайте попробуем помочь: Если и подготовленный оператор, и любая переменная, связанная с вашим подготовленным оператором, не были объявлены в одной и той же области видимости, то YES, вам нужно будет использовать глобальные переменные.

Если вы этого не сделаете, эти переменные не будут видны подготовленным оператором и будут рассматриваться как локальные переменные - и будут установлены в NULL.

0 голосов
/ 06 ноября 2013

Я не очень уверен насчет PHP и того, почему ваш скрипт работал, добавляя эти строки, но, отвечая на общий вопрос, я считаю плохой практикой объявлять ваше подготовленное утверждение как глобальные переменные.

Подготовленные заявления обычно должны быть закрыты; несоблюдение этого требования может привести к утечке памяти. Глобальные переменные доступны для всего объема модуля. Хотя это может быть неочевидно для простых сценариев, когда ваш код взрывается и его нужно масштабировать, может быть сложно отследить, какая часть кода использует какой глобальный ресурс. Это классический рецепт для параллельной катастрофы.

Очевидно, что если ваш код достаточно модульный , вам, возможно, придется объявить некоторые подготовленные операторы в каком-то модуле глобальными. Но когда вы делаете это, не забывайте, что вам нужен чистый способ закрыть эти ресурсы и что, когда вы объявляете их глобальными, вы делаете это не потому, что вы небрежны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...