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扩展本身不清楚和模棱两可。
然而,为了消除你的困惑
-
您可以在prepare()和
fetch()
之间的任何位置调用store_result()
。实际上,bind_result()
只是fetch()
的补充函数。 -
在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的力量