我有以下功能来准备和执行并返回结果。我调用它来准备我的插入查询并将值绑定到它并返回执行结果。但是当我在函数的范围内检查受影响的行数时,它会得到-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
但为什么呢?我们必须在全局中定义预处理语句变量吗?
答案 0 :(得分:0)
我不太确定PHP以及为什么你的脚本通过添加这些行来工作但是,为了回答一般问题,我认为将你准备好的语句声明为全局变量是不好的做法。
准备好的陈述通常需要关闭;不这样做会导致内存泄漏。全局变量可用于模块的整个范围。虽然对于简单的脚本来说可能并不明显,但是一旦代码爆炸并需要扩展,就很难跟踪代码的哪一部分正在使用什么全局资源。这是并发灾难的经典方法。
显然,如果您的代码模块化,您可能真的必须在某些模块中将一些预准备语句声明为全局。但是当你这样做时,不要忘记你需要有一个干净的方法来关闭这些资源,当你宣布它们是全局的时候,你这样做并不是因为你是马虎。
答案 1 :(得分:0)
有点晚但我们试着帮忙: 如果准备好的语句和绑定到预准备语句中的任何变量都未声明为同一范围,则YES,则需要使用全局变量。
如果您不这样做,这些变量将不会被准备好的语句看到,它将被视为本地变量 - 它将被解析为NULL。