关于mysqli扩展,php手册似乎有些亮点,我没有找到任何与谷歌相关的信息。
当我创建一个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()吗?
答案 0 :(得分: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();
答案 1 :(得分:1)
这不是PHP手册,但mysqli扩展本身不清楚且含糊不清。
然而,要清除你的困惑
您可以在prepare()和store_result()
之间的任意位置拨打fetch()
。事实上,bind_result()
只是fetch()
的补充功能。
在PHP中,你很少需要释放任何东西,特别是在这样的情况下,结果将在下次调用中被覆盖。所以 - 是的,您只需再次拨打execute()
(首先使用bind_param()
)。
另请注意,某些安装将允许您调用get_result,这使得获取变量的所有过程至少是合理的。但是并不总是可用
另请注意,bind_param()
和bind_result()
都不会让您轻松绑定任意数量的变量,这会使代码更加臃肿。
所以,看看所有这些混乱,我仍然建议你使用PDO或手动实现的占位符,如safeMysql。
答案 2 :(得分:-1)
这是正确的代码:
$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
的力量