我正在制作一个歌曲数据库系统,并且正在尝试实现一种方法,使用户可以根据要搜索的类别(歌曲名称,艺术家名称,专辑名称,流派等)和给定的搜索词搜索歌曲。为了适应用户输入并防止SQL注入,我使用了由绑定变量构成的准备好的语句,但是我对当前所做的操作有疑问:
search("genre", "electropop", $db);
function search($column, $term, $db) {
try {
$sql = "SELECT * FROM Songs WHERE :column=:term;";
$stmt = $db->prepare($sql);
$params = array("column" => $column,
"term" => $term);
$stmt->execute($params);
$arr = $stmt->fetchALL(PDO::FETCH_ASSOC);
print (json_encode($arr));
}
catch(PDOException $ex) {
catch_error("The search failed.", $ex);
}
}
每当我对此进行测试时,我都会得到一个空数组:[ ]
我在phpmyadmin中测试了我的查询(“ SELECT * FROM Songs WHERE genre ='electropop'”),并进行了查询(给了我后面的条目)。
SQL中WHERE子句的正确语法是该词需要用引号(https://www.w3schools.com/sql/sql_where.asp)包围,因此我尝试在该词周围使用引号将其转义:
...
$sql = "SELECT * FROM Songs WHERE :column=\':term;\'";
...
但是随后,它甚至没有将:term作为将变量绑定到以后的标记。
不确定如何解决此问题。我以为空数组是由于有效的搜索而导致的,但是没有结果,但是也许我没有正确使用准备好的语句。任何帮助将非常感激!谢谢!
答案 0 :(得分:1)
您错过了:
参数之前的term
。不需要绑定列名。只需使用$column
var而不是:column
。
search("genre", "electropop", $db);
function search($column, $term, $db) {
try {
$sql = "SELECT * FROM Songs WHERE $column=:term;";
$stmt = $db->prepare($sql);
$params = array(":term" => $term);
$stmt->execute($params);
$arr = $stmt->fetchALL(PDO::FETCH_ASSOC);
print (json_encode($arr));
}
catch(PDOException $ex) {
catch_error("The search failed.", $ex);
}
}