当前位置: 首页 > 面试题库 >

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

归星驰
2023-03-14
问题内容

我有以下代码:

$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服务器版本相对应的手册,以获取在’?附近使用的正确语法。第1行的较高(ARTICLE_NAME)喜欢’%?%’‘

如果我放

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.php中已准备好的语句中的参数数不匹配38

命令不同步;您现在不能运行此命令

然而

$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策略?


问题答案:

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


 类似资料:
  • 我想要使用mysqli执行一个简单的准备好的语句,但它不会工作。 致命错误:未捕获异常“mysqli_sql_exception”,消息为“查询/准备好的语句中没有使用索引SELECT*FROM ACCOUNCT WHERE EMAIL=?和password=?‘mysqli_stmt->execute()#1{main}

  • 使用Chris Brand的答案-它把我带到绑定参数并停在那里... 用阿卜杜拉的回答:

  • 我们有一个db2 database V9.7FP1 出现此错误消息的可能原因是什么?

  • 问题内容: 我只是想知道是否有一种方法可以在MySQL中使用某种形式的预处理语句,这样就不必逃避所有输入,也不必将所有文件从MySQL切换到MySQLi。我真的不相信转义功能,因此,如果在常规MySQL中有任何可行的替代方法,那就太好了。 问题答案: 使用PDO(PHP数据对象)连接到MySQL数据库。此方法将确保所有数据库输入将始终被视为文本字符串,并且您将不必进行任何手动转义。 结合正确使用h

  • 我已经下载并安装了Codeception。我使用了以下说明:http://codeception.com/thanks 在编写和运行测试后,我得到以下错误: 我的单元测试如下: 当我的类没有扩展时,不会调用函数,断言函数也不会工作。 欢迎任何建议。

  • 以下代码在准备时失败: 我发现:警告:mysqli::prepare()[mysqli.prepare]:无法获取mysqli。。。我在上面的代码中做错了什么?我检查了语法文档,但是如果我尝试将查询作为sql进行pas,我会得到一个语法错误。对于mysqli语法错误是否有一个好的调试工具?