2

簡単な質問です。preparemysqli でメソッドを使用している間。それは可能です/良い考えです。同じmysqli接続内で2回使用するには? 例:

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;
}

私の考えられるエラーは、同じ変数と同じデータベース接続を使用したことです。親関数で既に使用されている間に $this->DBH を呼び出したので、これが機能するかどうかは 100% 確信が持てません。私が達成しようとしていることに対するより良い方法はありますか、それとも私が使用できるより良い構造はありますか? それとも、あきらめて別の変数を使用する必要がありますか? 笑

期待される結果:

$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、一度に複数の open ステートメントを処理できます。

注意が必要なのは実行順序です。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()上記の問題に遭遇する可能性があります。この場合の 2 つの操作は、代わりに 1 つの操作で処理できる場合がJOINあります。そこから 1 つのループだけでフェッチして、すべての変数を入力し、必要に応じて出力配列を作成します。必要に応じて、これは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 に答える