1

php 手册似乎对 mysqli 扩展有点轻描淡写,我没有找到任何与 Google 相关的信息。

当我创建一个 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()?

4

3 回答 3

2

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

但是,为了消除您的困惑

  1. 您可以store_result()在 prepare() 和fetch(). 事实上,bind_result()只是一个补充功能fetch()

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

另请注意,某些安装将允许您调用get_result,这使得获取变量的所有过程至少是明智的。但并不总是可用

另请注意,既不bind_param()也不bind_result()会让您轻松绑定任意数量的变量,这将使代码更加臃肿。

所以,看到所有这些混乱,我仍然建议您使用 PDO 或手动实现的占位符,就像safeMysql一样。

于 2013-04-29T17:01:32.617 回答
1

这是一个有效的示例:

$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();
于 2013-04-23T18:54:41.760 回答
0

这是正确的代码:

$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的力量

于 2013-04-23T20:37:11.930 回答