2

快速提问。同时使用preparemysqli中的方法。这是可能的/一个好主意;在同一个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'));
4

1 回答 1

2

在上面的示例中,重要的变量是$query. 它们中的每一个都是其自己的方法的局部变量,因此变量本身不会发生冲突。如果情况合适,MySQLi 连接$this->DBH能够同时处理多个打开语句。

您需要谨慎的地方是他们的执行顺序。如果您准备并执行一条语句但不从中获取所有行,则在获取所有行之前您可能无法prepare()执行下一条,除非您首先关闭它mysqli_stmt::close()以释放打开的语句句柄。

例如:

// 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行可能有也可能没有与给定 ID 匹配的行。

SELECT 
  maintable.id, 
  maintable.col1,
  othertable.col2,
  othertable.col3
FROM
  maintable
  JOIN othertable ON maintable.id = othertable.id
于 2013-01-13T19:42:14.720 回答