1

我有以下代码:

$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.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 状态使用参数?

4

4 回答 4

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);
}
于 2009-03-03T12:30:02.783 回答
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);
于 2009-03-03T13:26:34.037 回答
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);
}
于 2009-03-02T11:28:55.980 回答
0

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

于 2009-03-02T11:36:17.867 回答