Php 在已经建立的连接中使用mysqli::prepare?
快速提问。在mysqli中使用Php 在已经建立的连接中使用mysqli::prepare?,php,mysql,mysqli,Php,Mysql,Mysqli,快速提问。在mysqli中使用prepare方法时。这是可能的/好主意;在同一个mysqli连接中使用它两次?例如: 面向对象分层 public function getStuff(){ $posts=array(); $query = $this->DBH->prepare('SELECT * FROM table WHERE stuff =?'); $query->bind_param('s','param'); $query->exe
prepare
方法时。这是可能的/好主意;在同一个mysqli连接中使用它两次?例如:
面向对象分层
public function getStuff(){
$posts=array();
$query = $this->DBH->prepare('SELECT * FROM table WHERE stuff =?');
$query->bind_param('s','param');
$query->execute();
$query->bind_result($ID,$col1,$col2,$etc);
while($query->fetch()){
$posts[]=array('ID'=>$ID,'col1'=>$col1,'extras'=>$this->getExtras($ID));
}
$query->close();
return $posts;
}
private function getExtra($postID){
$extras=array();
$query = $this->DBH->prepare('SELECT * FROM anotherTable WHERE moreStuff =?');
$query->bind_param('s',$postID);
$query->execute();
$query->bind_result($ID,$col1,$col2,$etc);
while($query->fetch()){
$extras[]=array('ID'=>$ID,'col1'=>$col1,'etc'=>$etc);
}
$query->close();
return $extras;
}
对,我可能的错误是我使用了相同的变量和相同的数据库连接。我不能100%确定这是否能工作,因为我调用了$this->DBH,而它已经在父函数中使用了。是否有更好的方法来实现我的目标,或者是否有更好的结构可以使用。还是我应该放弃使用一个单独的变量?哈哈
希望的结果:
$posts=array('ID'=>'column ID number','col1'=>'column1 data', 'extras'=>array('ID'=>'second table\'s ID number','col1'=>'second tables data','etc'=>'etc etc etc'));
在上面的示例中,重要的变量是
$query
。每一个变量都是其自身方法的局部变量,因此变量本身不会发生冲突。如果情况合适,MySQLi连接$this->DBH
能够同时处理多个open语句
你需要注意的地方是他们的执行顺序。如果您准备并执行一条语句,但没有从中提取所有行,则在提取所有行之前,您可能无法prepare()
下一条语句,除非您首先使用关闭它以取消分配open语句句柄
例如:
// Prepares successfully:
$s1 = $mysqli->prepare("SELECT * FROM t1");
// Also prepares successfully (previous one not executed)
$s2 = $mysqli->prepare("SELECT * FROM t2");
// Then consider:
$s1 = $mysqli->prepare("SELECT id, name FROM t1");
$s1->bind_result($id, $name);
$s1->execute();
// And attempt to prepare another
$s2 = $mysqli->prepare("SELECT id, name FROM t2");
// Fails because $s1 has rows waiting to be fetched.
echo $m->error;
// "Commands out of sync; you can't run this command now"
编辑:误读你的例子。。。
看看上面的示例,当您从getStuff()
语句中提取时,确实在调用getExtras()
。您可能会遇到上述问题。在这种情况下,您的两个操作可以通过一个连接来处理,从中只提取一个循环来填充所有变量,并根据需要构建输出数组。根据您的需要,如果相关的其他表中可能存在相关行,则这应该是内部联接
,或者如果相关的其他表
可能有或可能没有与给定ID匹配的行,则这应该是左联接
SELECT
maintable.id,
maintable.col1,
othertable.col2,
othertable.col3
FROM
maintable
JOIN othertable ON maintable.id = othertable.id
你试过运行代码吗?您是否得到了预期的结果和/或任何错误?但是,您可以通过在$posts数组上循环来添加额外的信息。getstuff()
函数正确返回(没有第二个函数)。我只是想知道我将这两个查询组合在一起的方式是否有复杂性?因为$this->DBH已经被查询了,在我的第二个函数getExtra()
中,我再次查询相同的连接。不确定这是否会导致问题?我不认为这会导致问题,但也许我错了。试试看。如果是这样,我们将修复它——或者只是在之后通过循环$posts数组来添加额外的信息。啊哈!谢谢,我想这是我的问题:)我觉得有些事情会发生冲突,所以我想我最好问一下。至于JOIN
我以前从未见过,这可能是我的答案。它还允许我只使用一个函数,而不是我提供的两个函数。我还注意到您提到了一个PDO
层。我在使用mysqli。这会对功能产生影响吗?@Beneto抱歉,这应该是MySQLi,而不是PDO。花些时间学习SQL连接,由于它们是至关重要的知识,正确使用它们可以比在循环中执行多个查询带来巨大的速度提升,我通常推荐Stack Overflow的两位创始人之一编写…@MichealBrekowski没问题:)我感觉你是指mySQLi lol,很酷,我会检查:)再次感谢你的帮助:)我真的应该看看正如你所说的,更多的SQL查询会限制我的查询量。我不知道。回答得好+1.