SQL LIKE查询失败 - 预准备语句中的致命错误

时间:2009-03-02 11:25:26

标签: php sql mysql mysqli

我有以下代码:

$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("ss", $table, $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

哪个应该可以正常工作。但是我收到错误:

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'附近使用正确的语法? WHERE upper(ARTICLE_NAME)LIKE'%?%''在第1行

如果我把

SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';

查询工作正常。 $ table在上面定义,并且从GET接收查询,并且两者都是正确的有效值。为什么这会失败?

编辑: 改为:

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", $query);

导致错误:

警告:mysqli_stmt :: bind_param()[mysqli-stmt.bind-param]:变量数与C:\ Program Files \ EasyPHP 3.0 \ www \ prog \ get_records中预准备语句中的参数数量不匹配。第38行的PHP

命令不同步;你现在不能运行这个命令

其中

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", "%".$query."%");

结果

致命错误:无法在第38行的C:\ Program Files \ EasyPHP 3.0 \ www \ prog \ get_records.php中通过引用传递参数2

最后

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", $query);

仅提供:

命令不同步;你现在不能运行这个命令

是否不可能使用参数作为LIKE statament?

4 个答案:

答案 0 :(得分:7)

对于LIKE子句,请使用:

SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')

对于表名,将表名作为参数是一种非常糟糕的做法。

如果由于某种原因你仍然需要这样做,你需要在准备查询之前将它嵌入查询文本中:

$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

答案 1 :(得分:2)

你发了吗

mysqli_free_result($result);

最后一次查询后? 这是命令不同步错误。

但这应该有用

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", "%".$query."%");

想知道$ query变量中的内容。 试着这样做

$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);

答案 2 :(得分:0)

请尝试以下方法:

$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("ss", $table, "%$brand%");
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

答案 3 :(得分:0)

Afaik你不能使用占位符作为mysqli和prepare语句的标识符。因此,您必须手动将表名插入到查询中。