0

パラメータ化されたクエリを実行するためにMertol Kasananのクラスを使用しています-

http://liveplanet.googlecode.com/svn-history/r132/trunk/db/DB.php

指を置いていないように見えるいくつかの問題を除いて、スクリプトに非常に満足しています。クラスの説明の簡単なチュートリアルで述べているように、クエリを実行する方法は次のとおりです。

$result = $db->query('SELECT * FROM `users` WHERE id = ? AND user_type = ? LIMIT ?',$id,$user_type,$limit);

パラメータを定義せずにクエリを実行する方法を誰でも理解できますか?

$result = $db->query('SELECT * FROM `users` WHERE id = 'y' ");

ない

$result = $db->query('SELECT * FROM `users` WHERE id = 'y' ", '');

バインド エラーが返されるため、このトリックを実行しないでください。回避策は

$result = $db->query('SELECT * FROM `users` WHERE 1 = ? AND id = 'y' ", 1);

クエリを実行するためのより適切な方法はありますか? クエリはクラス内の安全なソースから値を取得するため、パラメーターは必要ありません。

編集:

私がこれを持っているとしましょう:

if($HC == 'C'){
        $sql = "SELECT * FROM `photo_c` WHERE `user` = ?i AND `pic` != ?s AND cat != 'D' GROUP BY pic  LIMIT ?";
       $query = $this->dbs->query($sql,$this->user,$this->user_head,4);
    $results = $this->dbs->numRows($query);                 
    if($results < 3){
        $sql = "SELECT * FROM `photo` WHERE `user` = ?i AND `pic` != ?s ORDER BY  id ASC LIMIT ?";
       $query = $this->dbs->query($sql, $this->user,$this->user_head,4);                                
                                    }
    }else{

    $sql = "SELECT * FROM `photo_c` WHERE `user` = ?i AND `pic` != ?s AND cat = ?s ORDER BY RAND() LIMIT ?";
    $query = $this->dbs->query($sql,$this->user,$this->user_head,$HC,4);
        $results = $this->dbs->numRows($query);
                    }

ここで、正しいクエリからデータを取得するために、各クエリの下で $data->getAll を定義することができますが、それはコードを繰り返すことを意味するか、最後に定義された $query の結果からデータを抽出することを試みることができます。やり方がわからない。これを行うためのより良い方法があるかもしれないことは知っていますが、コーディング スタイルを改善しようとしています。$db->query の代わりに $db->getAll を使用することもできますが、私の知る限り、GetAll で numRows を使用することはできません。

4

1 に答える 1

0

実際のところ、このクラスはまったく使用できません。そして、あなたが言及した問題は少なくとも1つです。それを書いた人は、実際のプロジェクトでこのクラスを使用したことがないようです。

したがって、機能するクラスが必要な場合は、SafeMysqlを使用してください。まさにあなたが望むことを実行します。

$data = $db->getAll("SELECT * FROM `users` WHERE status = 'y'");

(追加のコードなしで、すでにデータを取得していることに注意してください)

それにもかかわらず、あなたはあなたの次の声明を理解する必要があります

クエリはクラス内の安全なソースから値を取得するため、パラメーターは必要ありません。

間違っている。記述したとおりにハードコードされた値を使用しても問題ありませんが、「安全な」変数
を使用する場合は、プレースホルダーを介して追加する必要があります。そうしないと、クエリがエラーを起こしやすく、安全でないままになります。

だから、そうでなければならない

$id = 1; // "safe" variable
$data = $db->getRow("SELECT * FROM `users` WHERE id = ?i", $id);

編集された質問に答える。必要かどうかはわかりませんが、コードは次のとおりです。それは

if($HC == 'C')
{
    $sql  = "SELECT * FROM `photo_c` WHERE `user` = ?i AND `pic` != ?s AND cat != 'D' GROUP BY pic  LIMIT ?";
    $data = $this->dbs->getAll($sql,$this->user,$this->user_head,4);
    if (count($data) < 3) {
        $sql = "SELECT * FROM `photo` WHERE `user` = ?i AND `pic` != ?s ORDER BY  id ASC LIMIT ?";
        $data = $this->dbs->query($sql, $this->user,$this->user_head,4);
    }
} else {
    $sql  = "SELECT * FROM `photo_c` WHERE `user` = ?i AND `pic` != ?s AND cat = ?s ORDER BY RAND() LIMIT ?";
    $data = $this->dbs->query($sql,$this->user,$this->user_head,$HC,4);
}
于 2013-04-01T05:48:03.057 に答える