快速提问。虽然在mysqli中使用prepare
方法。这是可能/一个好主意;在同一个mysqli连接中使用它两次?例如:
OOP分层
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'));
答案 0 :(得分:2)
在上面的示例中,重要的变量是$query
。其中每个都是自己的方法本地,因此变量本身不会发生冲突。如果情况正确,MySQLi连接$this->DBH
能够一次处理多个打开的语句。
您需要谨慎使用的地方是执行顺序。如果您准备并执行了一个语句但没有从中获取所有行,那么除非您先使用mysqli_stmt::close()
关闭它以取消分配所有行,否则在获取所有行之前,您可能无法prepare()
下一行。打开声明句柄。
例如:
// 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"
查看上面的示例,您确实正在调用getExtras()
,而是从getStuff()
语句中提取的。您可能会遇到上述问题。在这种情况下,您的两个操作可能只能用一个JOIN
来处理,您只需从一个循环中获取所有变量并根据需要构建输出数组。根据您的需要,如果预计INNER JOIN
中存在相关行,则该值应为othertable
;如果相关LEFT JOIN
可能存在或不存在othertable
,则应为SELECT
maintable.id,
maintable.col1,
othertable.col2,
othertable.col3
FROM
maintable
JOIN othertable ON maintable.id = othertable.id
有一行匹配给定的ID。
{{1}}