当前位置: 首页 > 知识库问答 >
问题:

简单的搜索功能,MySQL准备语句问题

缑勇锐
2023-03-14

我目前正在为一个网站创建一个非常简单的搜索特性,在该特性中,用户可以使用许多不同的条件(从一个到多个,不同的数量)在数据库中搜索事件,我正在使用准备好的语句,特别是bind_param()遇到一个问题。

以下是相关的PHP代码:

...
...
$title = (empty($_POST['eventTitle'])) ? null : $_POST['eventTitle'];
$venue = (empty($_POST['venue'])) ? null : $_POST['venue'];
$catID = (empty($_POST['catID'])) ? null : $_POST['catID'];
$start = (empty($_POST['start'])) ? null : $_POST['start'];
$end = (empty($_POST['end'])) ? null : $_POST['end'];
$price = (empty($_POST['price'])) ? null : $_POST['price'];

include 'database_conn.php';

$sql = 'SELECT eventID, eventTitle, venueID, catID, eventStartDate, 
eventEndDate, eventPrice FROM te_events WHERE 1';

$sqlCondition = '';

$bindFirstArg = '"';
$bindSecondArg = '';

if($title !== null && !empty($title)) {

    $sqlCondition = $sqlCondition . " AND eventTitle LIKE \"%" 
    . $title . "%\"";

}

if($venue !== null && $venue !== '0') {

    $sqlCondition = $sqlCondition . " AND venueID=?";
    $bindFirstArg = $bindFirstArg . "s";
    $bindSecondArg = $bindSecondArg . ", " . $venue;

}

if($catID !== null && $catID !== '0') {

    $sqlCondition = $sqlCondition . " AND catID=?";
    $bindFirstArg = $bindFirstArg . "s";
    $bindSecondArg = $bindSecondArg . ", " . $catID;

}

if($start !== null && $start !== '0') {

    $sqlCondition = $sqlCondition . " AND eventStartDate=?";
    $bindFirstArg = $bindFirstArg . "s";
    $bindSecondArg = $bindSecondArg . ", " . $start;

}

if($end !== null && $end !== '0') {

    $sqlCondition = $sqlCondition . " AND eventEndDate=?";
    $bindFirstArg = $bindFirstArg . "s";
    $bindSecondArg = $bindSecondArg . ", " . $end;

}

if($price !== null && !empty($price)) {

    $sqlCondition = $sqlCondition . " AND eventPrice=?";
    $bindFirstArg = $bindFirstArg . "i";
    $bindSecondArg = $bindSecondArg . ", " . $price;

}

$sql = $sql . $sqlCondition;
$bindFirstArg = $bindFirstArg . '"';

$search_stmt = $conn -> prepare($sql);

if (false===$search_stmt) {

    die('prepare() failed: ' . htmlspecialchars($conn->error));

}


$search_stmt -> bind_param($bindFirstArg, $bindSecondArg);
$search_stmt -> execute();
$search_stmt -> bind_result($eventIDRes, $eventTitleRes, $venueIDRes, 
$catIDRes, $eventStartRes, $eventEndRes, $eventPriceRes);

while ($search_stmt->fetch()) {

    printf ("%s %s %s %s %s %s %i\n", $eventIDRes, $eventTitleRes, 
    $venueIDRes, $catIDRes, $eventStartRes, $eventEndRes, $eventPriceRes);

}

mysqli_stmt_close($search_stmt);

我收到的错误状态

共有1个答案

马凡
2023-03-14

您需要为查询中的每个传递bind_param单独的参数,并将格式作为第一个参数。不能给它传递逗号分隔的字符串,那样不行。它只是将其作为第一个读取,然后抱怨您没有发送其余部分。

另外,不要在$bindfirstarg字符串中添加引号。bind_param只需要所有数据类型的列表(IDSB),而不需要字符。

您需要做的是将值推入数组,然后通过call_user_func_array调用bind_param

$sqlCondition = '';

$bindFirstArg = '';
$bindParams = array();


// You need to bind $title as well, otherwise you are wide open to SQL
// injection and have just thrown out the benefits of prepared statements
if($title !== null && !empty($title)) {
    $sqlCondition .= " AND eventTitle LIKE ?";
    $bindFirstArg .= "s";

    // Add the `%` to the value, not the query
    $title = "%{$title}%";
   // bind_param wants these to be references
    $bindParams[] =& $title;

}

// Change all your ifs to look like this.
// They need to push into the $bindParams array
if($catID !== null && $catID !== '0') {
    $sqlCondition .= " AND catID=?";    
    $bindFirstArg .= "s";

    // bind_param wants these to be references
    $bindParams[] =& $catID;
}

// etc...

$sql .= $sqlCondition;
$search_stmt = $conn->prepare($sql);

// Call bind_param with the correct number of parameters
array_unshift($bindParams, $bindFirstArg);
// This will make sure the parameters are passed correctly.
// Each variable needs to be passed as a separate parameter
call_user_func_array(array($search_stmt, 'bind_param'), $bindParams);

$search_stmt->execute();
$search_stmt->bind_result($eventIDRes, $eventTitleRes, $venueIDRes, 
    $catIDRes, $eventStartRes, $eventEndRes, $eventPriceRes);

while ($search_stmt->fetch()) {
    printf ("%s %s %s %s %s %s %i\n", $eventIDRes, $eventTitleRes, 
        $venueIDRes, $catIDRes, $eventStartRes, $eventEndRes, $eventPriceRes);
}

$search_stmt->close();
 类似资料:
  • 我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。

  • 问题内容: 我的目的是在表中找到与存储在String中的集合匹配的所有项目: 这似乎并不完美,它总是向我发出以下警告: 如果我有一个参数,这将是显而易见的: 但是由于我不得不处理这个问题,这对我来说有点复杂。 问题答案: Prepared语句没有参数,因为您在准备列表之前已将列表插入到该语句中。 至此,您创建的SQL语句为: 由于该语句没有参数,因此失败。而不是将项目插值到语句(容易注入)中,而是

  • 本文向大家介绍javascript实现简单搜索功能,包括了javascript实现简单搜索功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript实现简单搜索功能的具体代码,供大家参考,具体内容如下 注意事项: A.search(B)可以在A中搜索B的位置,返回B出现的位置 A.split(B)将A以B划分为几部分,并返回数组,相当于分词操作 运行结果如下: 更多搜索

  • 我有一个使用布尔全文搜索的sql查询: 即,中的引号和语音标记对查询很重要。 当我以spring jdbc预备语句的形式运行这个查询时,我必须做一些工作来正确格式化字符串,因为如果我有< code > '?',jdbc不会将它识别为参数: 但是查询没有生成正确的结果,结果的顺序也不符合预期。我只能假设这是由于prepared语句参数中的格式设置造成的。但我看不到添加参数后的查询是什么样子,我如何调

  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行它都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做

  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行时都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做