调用mysqli准备语句的函数顺序?

时间:2013-04-23 18:13:28

标签: php mysqli

关于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()吗?

3 个答案:

答案 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扩展本身不清楚且含糊不清。

然而,要清除你的困惑

  1. 您可以在prepare()和store_result()之间的任意位置拨打fetch()。事实上,bind_result()只是fetch()的补充功能。

  2. 在PHP中,你很少需要释放任何东西,特别是在这样的情况下,结果将在下次调用中被覆盖。所以 - 是的,您只需再次拨打execute()(首先使用bind_param())。

  3. 另请注意,某些安装将允许您调用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

的力量