【问题标题】:SQL LIKE query failing - fatal error in prepared statementSQL LIKE 查询失败 - 准备好的语句中的致命错误
【发布时间】:2010-10-10 18:16:07
【问题描述】:

我有以下代码:

$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 语句不能使用参数吗?

【问题讨论】:

标签: php sql mysql mysqli


【解决方案1】:

你发了吗

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);

【讨论】:

  • 我不知道在哪里发出这个问题。我已经释放了所有我能看到的东西,但仍然出现这个错误。
  • 这可能发生,例如,如果您正在使用 mysql_use_result() 并在调用 mysql_free_result() 之前尝试执行新查询。如果您尝试执行两个返回数据的查询而不在其间调用 mysql_use_result() 或 mysql_store_result(),也会发生这种情况。
【解决方案2】:

对于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);
}

【讨论】:

  • 其他人已经说过了,但是将表名作为参数传递可以正常工作吗?这样做是不好的做法吗?
  • 将表名作为参数传递是行不通的,MySQL 也无法准备这样的语句。您不能将表名作为参数的准备好的语句。
【解决方案3】:

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

【讨论】:

  • 嗯。当我没有将表名作为参数时,它们之前失败了。
【解决方案4】:

请尝试以下方法:

$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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多