mysqli类中的参数化查询

时间:2013-03-31 22:34:06

标签: mysqli prepared-statement

我正在使用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-&gt; getAll - 但这意味着重复我的代码或者我可以尝试从最后定义的$ query结果中提取数据 - 我不知道该怎么做。 我知道可能有更好的方法来做这个,但我正在努力改进我的编码风格,因为我认为safemysql类需要一些改进,即使这意味着更多的文档。 我可以尝试使用$ db-&gt; getAll而不是$ db-&gt;查询,但据我所知,我不能在GetAll上使用numRows。

1 个答案:

答案 0 :(得分:0)

事实上,这门课程完全无法使用。你提到的问题至少是一个问题。 似乎有人写了它,从未在现实生活中使用过这个类。

所以,如果你想要一个有效且工作方式更好的课程,请选择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);
}