我目前的代码是:
$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准备声明中使用它们。
解决这个问题的更好方法是什么?
答案 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中指明您的字符集):queryorderby
:queryorder
*我引用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();