mysql预处理语句的函数调用顺序


Order of function calls for mysqli prepared statements?

php手册似乎是关于mysqli扩展有点轻,我没有找到任何信息戳与谷歌。

当我创建一个mysqli预处理语句时,调用的顺序应该是

吗?
mysqli::prepare()
mysqli::stmt::bind_param()
mysqli::stmt::execute()
mysqli::stmt::store_result()
mysqli::stmt::bind_result()

mysqli::prepare()
mysqli::stmt::bind_param()
mysqli::stmt::execute()
mysqli::stmt::bind_result()
mysqli::stmt::store_result()

此外,如果我想更改参数并重新执行语句,我应该使用

吗?
mysqli::free_result()
mysqli::stmt::execute()
mysqli::stmt::store_result()
mysqli::bind_result()

或者我可以简单地再次使用execute(),然后使用free_result()一旦我完成使用语句?

这不是PHP手册,而是mysqli扩展本身不清楚和模棱两可。

然而,为了消除你的困惑

  1. 您可以在prepare()和fetch()之间的任何位置调用store_result()。实际上,bind_result()只是fetch()的补充函数。

  2. 在PHP中,通常很少需要释放任何东西,特别是在这种情况下,当结果将在下一次调用中被覆盖时。所以-是的,你可以简单地再次调用execute()(先调用bind_param())。

还请注意,一些安装将允许您调用get_result,这使得所有获取变量的过程至少是合理的。但它并不总是可用的

还要注意,bind_param()bind_result()都不能让您轻松绑定任意数量的变量,这会使代码更加臃肿。

所以,看着所有的混乱,我仍然建议你使用PDO或手动实现占位符,像safeMysql。

下面是一个有效的例子:

$query="SELECT service_ip,service_port FROM users WHERE username=? and password=?";
$conn=connection();
$stmt = $conn->prepare($query);
$stmt->bind_param('ss', $user,$pass);
$ans=$stmt->execute();
$service_ip=false;
$service_port=false;
$stmt->bind_result($service_ip,$service_port);
$stmt->fetch();
mysqli_free_result($ans);
$stmt->close();
$conn -> close();

下面是正确的代码:

$query="SELECT service_ip,service_port FROM users WHERE username=? and password=?";
$stmt = $conn->prepare($query);
$stmt->execute(array($user,$pass));
$data = $stmt->fetch()/fetchAll()/fetchColumn(); 
// whoops! that's all
// ...in case you want to execute again
$stmt->execute(array($user2,$pass2));
$data = $stmt->fetch()/fetchAll()/fetchColumn();
// and again...
$stmt->execute(array($user3,$pass3));
$data = $stmt->fetch()/fetchAll()/fetchColumn(); 

请注意,您已经拥有了所需的所有数据。感受PDO的力量