2013-04-23 66 views
0

关于mysqli扩展的php手册似乎有点轻,我没有发现任何与Google戳动的信息。函数调用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()on我完成了使用该声明?

+0

我试图只是运行的功能在这两个订单和,毫无疑问,我的测试服务器上的任何命令的作品,但我的生产服务器上,一个为了工作有时,然后另外的顺序工作的时候,但是这种随时间变化。 – 2013-04-23 18:14:28

+0

如果您在使用某些代码时遇到问题,最好提出一个关于这个特定代码的问题,并将其与问题一起提供。但是,我有一种感觉,这不是电话订单,而是缺少错误报告的原因。 – 2013-04-29 19:17:51

回答

1

它不是PHP手册,但mysqli扩展本身是不明确,暧昧的权力。

然而,要明确你的困惑

  1. 您可以拨打store_result()任何你希望之间准备()和fetch()。事实上,bind_result()只是fetch()的补充功能。

  2. 在PHP中,你很少需要释放一般什么,尤其是在这样的情况下,当结果将在下次调用被覆盖。所以 - 是的,您可以再次拨打​​(首先使用bind_param())。

还要注意,一些设施将让你打电话get_result这使得至少有合理的获取变量的所有过程。但并不总是可用

还要注意的是,无论bind_param()也不bind_result()将让你轻松地结合任意一些变数,这将使甚至代码更加臃肿。

所以,看所有的烂摊子我还是建议你使用任何PDO或手动实现占位符,像safeMysql一样。

+0

我实际上已经找到了一个简单的解决方案,我一直使用bind_param()和bind_result()。那么我想它大约比你在PDO上使用的时间长一行,但是,嘿,它就是它的意思。 – 2013-05-01 13:28:57

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(); 
+0

感谢您的工作代码,但是,手册注意到您应该调用store_result来返回结果的所有查询,并且在代码中的任何位置都看不到此调用。 – 2013-04-23 19:02:47

+0

我记得我几个月前学过api,而且我给你的代码是一个正在运行的生产代码,我认为你只是错过了取回 – Dima 2013-04-23 19:24:35

+0

我发布的代码只是绑定的sudo代码。我也有工作生产代码,但我列出的调用顺序对我的生产服务器有一些问题。该手册对调用store_result非常明确。另外,打开多个语句将不起作用,除非您调用store_result。 直接从PHP手册中获取: 对于成功生成结果集(SELECT,SHOW,DESCRIBE,EXPLAIN)的每个查询,并且仅当您想缓冲客户端的完整结果集时,您必须调用mysqli_stmt_store_result ... – 2013-04-23 19:42:14

-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

+1

我确定PDO很棒,但是这个代码根本没有回答这个问题。您的代码完全无法绑定任何参数或任何结果。 – 2013-04-23 20:43:20

+1

恐怕你错了。它实际上绑定了参数和结果。这就是让PDO确实很棒的一点。 – 2013-04-23 20:49:39

+0

就像我说过的,PDO舒尔很棒,但使用它的答案并不能毫无问题地回答这个问题。 – 2013-04-23 21:08:22

相关问题