PDO中的SELECT语句用php生成数组

时间:2014-09-27 19:55:22

标签: php mysql pdo

我目前的代码是:

$class = explode("-", $_REQUEST['class']);
$statement1 = $db->prepare("SELECT * FROM Medication WHERE class = :class OR class =:class1 OR class =:class2 OR class =:class3 OR class =:class4 ORDER BY :queryorderby :queryorder ");
$statement1->execute(array(':class' => $class[0], ':class1' => $class[1], ':class2' => $class[2], ':class3' => $class[3], ':class4' => $class[4],':queryorderby' => $queryorderby,  ':queryorder' => $queryorder));
$excutereally = $statement1->fetchall();

正如您所看到的,我已经输入$class[0]然后$class[1] ...等等到我的准备语句中,我认为这是非常耗时的,并且应该有另一个选项来获取所有数组和在PDO准备声明中使用它们。

解决这个问题的更好方法是什么?

2 个答案:

答案 0 :(得分:-1)

不要使用准备好的声明:

$statement1 = $db->query('SELECT * FROM Medication WHERE class IN(' . implode(',', array_map(array($db, 'quote'), $class)) .  ') ORDER BY `' . str_replace('`', '``', $queryorderby) . '` ' . (0 == strcasecmp($queryorder, 'DESC') ? 'DESC' : 'ASC'));
$excutereally = $statement1->fetchAll();
  • 这是安全的:
    • IN部分中的数据被PDO :: quote转义(只需注意在DSN中指明您的字符集)
    • SQL标识符"转义"以MySQL方式*
  • 比准备好的陈述更正确:
    • 您无法在:queryorderby
    • 上绑定SQL标识符
    • 您无法在:queryorder
    • 上绑定关键字(ASC / DESC)

*我引用MySQL文档:

  

标识符引号字符是反引号(“`”):

     

的MySQL> SELECT * FROM`select` WHERE`select`.id> 100;

     

[...]

     

如果引用标识符,标识符引号字符可以包含在标识符中。如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则需要将该字符加倍。以下语句创建一个名为a`b的表,其中包含名为c" d:

的列      

的MySQL> CREATE TABLE`a``b`(`c" d` INT);

答案 1 :(得分:-2)

$class = explode("-", $_REQUEST['class']);
$statement1 = $db->prepare("SELECT * FROM Medication WHERE class = ? OR class = ? OR class = ? OR class =? OR class =? ORDER BY ? ? ");

$statement1->execute(array($class[0],$class[1],$class[2], $class[3], $class[4], $queryorderby,  $queryorder));
$excutereally = $statement1->fetchall();