Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在已经建立的连接中使用mysqli::prepare?_Php_Mysql_Mysqli - Fatal编程技术网

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

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

快速提问。在mysqli中使用
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.