-1

基本的に、私はオンラインで見つけたmySQLiラッパーを使用しています.

<?php 
    $res = $DB->Query("SELECT * FROM `table`");
    while($row = $DB->Fetch()) {
?>
<tr>
    <td><?php echo $row['id']; ?></td>
    <td><?php echo $functions->checkStatus($row['arowhere']); ?></td>
</tr>
<?php 
      }
?>

したがって、これを実行しようとすると、テーブル行の$functions->checkStatus($row['arowhere']); この関数内で新しいクエリが実行され、使用されている最新のクエリが変更されますwhile($row = $DB->Fetch()) {

public function Query($SQL) {
        $this->SQL = $this->mysqli->real_escape_string($SQL);
        $this->Result = $this->mysqli->query($SQL);

        if ($this->Result == true) {
            return true;
        } else {
             die('Problem with Query: ' . $this->SQL);
        }
}

public function Fetch() {
    return mysqli_fetch_assoc($this->Result);
}

解決策はありますか、誰かが私を正しい方向に向けてくれるので、これを避けることができます.

4

2 に答える 2

1

そのようなラッパーがオンラインで見つかるとは信じられません。実際のところ、それは完全に、最終的には使用できません。

やっmysqli->real_escape_string($SQL);ても全く意味がありません。クエリをインジェクションから保護することはできませんが、複雑なクエリが台無しになります。WHERE 条件でクエリを実行しようとするとすぐに、エラーで終了します。

そして、次の行も間違っています

die('Problem with Query: ' . $this->SQL);

エラーもファイルと行番号も表示されないためです。

そして少なくとも、このラッパーの問題はあなたが直面しているものです -内部変数を使用して結果を保持していますが、それを返すだけです。

実際の mysqli ラッパーは SafeMysqlであり、プレースホルダーを介してあらゆる動的データを追加できます。

SafeMysql を使用すると、コードが機能します。

<?php 
    $res = $DB->query("SELECT * FROM `table`");
    while($row = $db->fetch($res)) {
?>
<tr>
    <td><?php echo $row['id']; ?></td>
    <td><?php echo $functions->checkStatus($row['arowhere']); ?></td>
</tr>
<?php 
      }
?>
于 2013-04-17T05:58:52.090 に答える
0

行を反復処理して、それらを一時配列に追加できます。他のクエリが作成された後、この配列を介して行を参照できます。これは、クエリによって返される行が多すぎる場合にメモリに影響を与える可能性があるため、注意してください。

<?php 
$res = $DB->Query("SELECT * FROM `table`");

$rows = array();
while($row = $DB->Fetch()) {
    array_push( $rows, $row );
}

foreach( $rows as $row ){
?>
    <tr>
        <td><?php echo $row['id']; ?></td>
        <td><?php echo $functions->checkStatus($row['arowhere']); ?></td>
    </tr>
<?php 
}
unset( $rows ); // destroys the temporary array, freeing the memory it consumed
?>
于 2013-04-17T02:55:20.970 に答える