如何使用LIKE %%的binValue

时间:2014-11-09 11:36:22

标签: php mysql

这是我的MySql请求(它有效):

SELECT `membre_pseudo` FROM `membres` WHERE lower(`membre_pseudo`) LIKE "louis%" ORDER BY `membre_pseudo`

但是当我在我的php脚本中添加变量时,它会返回一个空白页面:

$query = $bdd->prepare('SELECT `:field` FROM `:table` WHERE lower(`:field`) LIKE ":search%" ORDER BY `:field`');
    $query->bindValue(':field',$field,PDO::PARAM_STR);
            $query->bindValue(':table',$table,PDO::PARAM_STR);
            $query->bindValue(':search',$search,PDO::PARAM_STR);
            $query->execute();
    while($row = $query->fetch()){
        echo '<suggest>'.$row[$field].'</suggest>';
    }
    $query->closeCursor();
    echo '</suggests>';

有你的想法吗?

路易斯

2 个答案:

答案 0 :(得分:1)

正如@Ghost所提到的,你不能绑定表名和字段名,所以你的查询应该被重写,例如:

$query = $bdd->prepare('SELECT `field_name` 
    FROM `table_name` 
    WHERE lower(`field_name`) 
    LIKE :search 
    ORDER BY `field_name`');

请注意,"占位符周围不需要:search

另外我不明白为什么你将:search绑定为PARAM_INT,我认为它应该是字符串:

$query->bindValue(':search', $search . '%', PDO::PARAM_STR); // add % sign here

此外,PDO还可以检查执行过程中是否发生错误 - http://php.net/manual/en/pdostatement.errorinfo.php阅读并使用它。

答案 1 :(得分:0)

感谢@u_mulder,但我必须将表和字段作为变量。所以我这样做了:

<?php
require_once(BASEPATH. 'config.php');
//Sécurité pour empêcher d'interroger la base librement : liste des table et des champs utilisables
$check = array(
    'membres' => array('membre_pseudo')
);

$table = (isset($_GET['table']) ? $_GET['table'] : '');
$field = (isset($_GET['field']) ? $_GET['field'] : '');
$search = (isset($_GET['search']) ? $_GET['search'] : '');

if(isset($check[$table]) && in_array($field, $check[$table])){ //Vérification
    if($table && $field && $search){
        $search = strtolower(mysql_escape_string($search));

                echo '<suggests>';

                $query = $bdd->query('SELECT `'.$field.'` FROM `'.$table.'` WHERE lower(`'.$field.'`) LIKE "'.$search.'%" ORDER BY `'.$field.'`');
        while($row = $query->fetch()){
            echo '  <suggest>'.$row[$field].'</suggest>';
        }
        $query->closeCursor();

        echo '</suggests>';
    }
}
else{
    die('Requête interdite');
} 
?>

我已经集成了安全检查以避免SQL注入。