使用mysqli :: prepare在已建立的连接中使用prepare?

时间:2013-01-13 19:29:41

标签: php mysql mysqli

快速提问。虽然在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'));

1 个答案:

答案 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}}