这是我的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>';
有你的想法吗?
路易斯
答案 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注入。