2012-01-06 31 views
1

私は最近Prepared Statementの学習を始め、新しいスタイルでスクリプトを構成し始めました。複数のクエリを同じページに表示できません

しかし、私は小さな壁にぶつかり、誰かが正しい方向に私を向けることを望んでいますか?ここで

は私のSQLクエリの構造である:

<?php 

echo "<select = \"SpecialConditions\">"; 
if($stmt->num_rows == NULL){ 
    echo "No results found."; 
}else{ 
    while($stmt->fetch()){ 

    echo "<option value=\"$specialId\">$specialcondition</option>"; 
} 
} 
echo "</select>"; 
?> 

、別のコードブロック:

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`, 
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`"; 

$stmt = $Mconn->prepare($query); 
$stmt->bind_result($results, $success, $failed, $counter, $grades, $classes, 
$specialId, $specialcondition); 
$stmt->execute(); 
$stmt->store_result(); 

そしてここでは、一つのコードブロックである

<?php 
echo "<select = \"Grades\">"; 
if($stmt->num_rows == NULL){ 
    echo "No results found."; 
}else{ 
    while($stmt->fetch()){ 

     echo "<option value=\"".$grades."\">".$grades."</option>"; 
    } 
} 
echo "</select>"; 

?> 

[OK]を、今何が起こっているのかさこれらのクエリを同じページに配置すると、最初のブロックは2番目のブロックとその下の別のクエリを強制終了し、私は理由を理解することができず、私はこれを終わりまで研究しました。

私は同じコードブロック内でトリックを行うかもしれないが、勝つことはできないと考えて接続を閉じようとしました。

DB接続が動作していることを知っています。返された結果が実際に格納されていることがわかります。別のページで各ブロックをテストすると、正常に動作します。

ご協力いただきありがとうございます。

答えて

1

最終的にはうまくいきました。すべてが配列に格納され、それが見えるように抽出する必要があります。少なくともそれが私が正しく働くための唯一の方法です。

誰かが好奇心を抱いているか、将来この壁に当たった場合の最終的な解決策です。あなたがこの方法を必要としない方法を知っているなら、私に知らせてください。接続して、データベースを照会

マイダイナミック機能:ここ

<?php 

function DB_Query(){ 
$databasefields = array(); 
$results = array(); 

@$Mconn = new mysqli(DBHOST, DBUSER, DBPWRD, DBNAME); 

    if ([email protected]_connect(DBHOST, DBUSER, DBPWRD, DBNAME)){ 
    die(DBERROR); 
    } 

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`, 
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`"; 

$stmt = $Mconn->prepare($query); 
$stmt->execute(); 
$meta = $stmt->result_metadata(); 

while($field = $meta->fetch_field()){ 
$databasefields[] = &$row[$field->name]; 
} 

call_user_func_array(array($stmt, 'bind_result'), $databasefields); 
while($stmt->fetch()){ 
    $queried = array(); 
    foreach($row as $key => $vector){ 
     $queried[$key] = $vector; 
    } 

    $results[] = $queried; 
} 

return $results; 
} 

$results = DB_Query(); // placed in DB include file 
?> 

をそして私が実際に使用して、単独または複数のブロックにデータを表示するコードです。自分の名前に合わせてフィールド名を変更するだけです。この関数は動的であり、バインド結果をハードコードする必要がないため、必要な数のフィールドを取得できます。

<?php 
foreach($results as $row){ 
echo $row['grades'].'<br />'; 
} 

すべてのヘルプのおかげで、私はこれは私がやったのと同じ問題に遭遇したものを助けるのに役立つ願っています。

+0

溶液におめでとう。あなたができるときは、左側のチェックマークを使ってあなたの答えを「受け入れられた」とマークしてください。これは他の人にあなたの問題が解決されたことを知らせるでしょう。乾杯〜 –

+0

ありがとうございます。 – Cryotech

4

あなたがそれら

$stmt->close(); 

で行われているときは、別のは、あなたがそのすべてのデータをフェッチしている場合でも、まだ未解決である間は、他のプリペアドステートメントを起動することはできませんclose the statementsに持っています。

+0

こんにちはマーク、私はあなたが提案したものを試しましたが、同じページに複数のクエリを表示することはできません。だから私は両方のブロックに配置しようとしましたが、$ stmt-> close();を配置しました。 mysqli_stmt :: close()[mysqli-stmt.close]:mysqli_stmtをフェッチできませんでした – Cryotech

+0

フェッチループ内で - > close()コールをしましたか?フェッチループが完了し、取得が完了した後にのみ行う必要があります。 –

+0

こんにちはマーク、いいえ、タグの直後に配置し、最後のタグの直前に2つの}}の間に配置してみましたが、何も動作していないようです。私は結果が肯定的であることを知っている、私はちょうど何らかの理由でそれらを表示することができません。 – Cryotech

関連する問題