带有LIKE子句的PHP参数化mysql语句返回不同步的命令

带有LIKE子句的PHP参数化mysql语句返回不同步的命令,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试使用一个LIKE子句来处理php和mysql的参数化查询。但每次我尝试,我都会遇到不同的错误 我已尝试从和实施解决方案。每一个都会抛出不同的错误,所以我担心问题在于我遗漏了什么。如果我尝试在execute函数中使用一个数组,则会出现命令不同步错误。当我尝试绑定值或参数时,我得到一个不能绑定字符串的错误 我不知道我错过了什么 谢谢你的帮助 <? $access = 3; $dbConnect = true; require "../scripts/php

我正在尝试使用一个LIKE子句来处理php和mysql的参数化查询。但每次我尝试,我都会遇到不同的错误

我已尝试从和实施解决方案。每一个都会抛出不同的错误,所以我担心问题在于我遗漏了什么。如果我尝试在execute函数中使用一个数组,则会出现命令不同步错误。当我尝试绑定值或参数时,我得到一个不能绑定字符串的错误

我不知道我错过了什么

谢谢你的帮助

 <? 
    $access = 3;
    $dbConnect = true;
    require "../scripts/php/scriptSecurity.php";

    // Partial name given by user.
    $namePart = $_GET["namePart"];

    // Deal with name parts. last, first middle or first middle last, or first last
    if (strpos($namePart, ',') !== false){
        $arr_name = explode(",", $namePart);
        $lName = $arr_name[0];
        if (strpos($arr_name[1], " ") !== false){
            $firstName = substr($arr_name[1], 0, strpos($arr_name[1], " ", 1));
            $middleName = substr($arr_name[1], strpos($arr_name[1], " ", 1));
        }
    }
    elseif (strpos($namePart, " ") !== false){
        $arr_name = explode(" ", $namePart);
        if (sizeOf($arr_name) == 3) {       
            $fName = $arr_name[0];
            $lName = $arr_name[3];
            $mName = $arr_name[2];
        }
        elseif (sizeOf(arr_name) == 2) {
            $fName = $arr_name[0];
            $lName = $arr_name[1];
            $mName = $arr_name[1];
        }
        else {
            $fName = $namePart;
            $mName = $namePart;
            $lName = $namePart;
        }
    }
    else {
        $fName = $namePart;
        $lName = $namePart;
        $mName = $namePart;
    }
    // Get rid of extra spaces.
    $fName = str_replace(" ", "", $fName);
    $lName = str_replace(" ", "", $lName);
    $mName = str_replace(" ", "", $mName);
    // build query
    $query = "SELECT LastName, FirstName, MiddleName, StudentId, Gender, Grade, GradYear FROM students WHERE LastName LIKE ? OR FirstName LIKE ? OR MiddleName LIKE ? ORDER BY LastName, FirstName LIMIT 20";
    $stmt = $connect->prepare($query);
    // execute
    $stmt->execute(array('%'.$lName.'%', '%'.$fName.'%', '%'.$mName.'%'));
    $result = $stmt->get_result();
    // post results
    if (!$result) {
        echo $connect->error;
        echo "No Results";
    }
    else {
        echo "Results";
        while ($row = $result->fetch_assoc()){
            ?>
                <div><? echo $row["LastName"] . ", " . $row["FirstName"] . "(" . $row["StudentId"] . ")"?> </div>
            <?php 
        }
    }
?>

如果以错误的方式在param中使用wildchar传递字符串,可以使用最简单的方法使用concat管理wildchar,并将纯var指定为param

  $query = "SELECT LastName, FirstName, MiddleName, StudentId, Gender, Grade, GradYear 
  FROM students 
  WHERE LastName LIKE concat('%',?, '%') 
  OR FirstName LIKE concat('%',?, '%')
  OR MiddleName LIKE concat('%',?, '%')
  ORDER BY LastName, FirstName 
  LIMIT 20";
  $stmt = $connect->prepare($query);
  // execute
  $stmt->execute(array($lName, $fName, $mName));

如果以错误的方式在param中通过wildchar传递字符串,则可以使用最简单的方法使用concat管理wildchar,并将纯var指定为param

  $query = "SELECT LastName, FirstName, MiddleName, StudentId, Gender, Grade, GradYear 
  FROM students 
  WHERE LastName LIKE concat('%',?, '%') 
  OR FirstName LIKE concat('%',?, '%')
  OR MiddleName LIKE concat('%',?, '%')
  ORDER BY LastName, FirstName 
  LIMIT 20";
  $stmt = $connect->prepare($query);
  // execute
  $stmt->execute(array($lName, $fName, $mName));

谢谢你的快速回复。我尝试了这个方法,现在得到了:对Boolean上的成员函数bind_param()的调用您错过了lastname列名。。在…之前。。添加缺少的代码。。为什么要投否决票呢?好吧…所以我在代码中犯了一个错误。刚刚解决了这个问题,现在我得到了结果,但我只得到了第一个角色的结果。如果$namePart是一个字符,我将使用该字符获得前20个结果。当我键入第二个字符时,我没有得到错误,但没有得到任何结果。为此,您应该在查询之前检查代码,这似乎是另一个问题,尊重您的原始问题是的。对。我会分开发。这是一个新问题。我只是讨厌解决一个问题,却被介绍给下一个…*叹气。再次感谢您的帮助。感谢您的快速回复。我尝试了这个方法,现在得到了:对Boolean上的成员函数bind_param()的调用您错过了lastname列名。。在…之前。。添加缺少的代码。。为什么要投否决票呢?好吧…所以我在代码中犯了一个错误。刚刚解决了这个问题,现在我得到了结果,但我只得到了第一个角色的结果。如果$namePart是一个字符,我将使用该字符获得前20个结果。当我键入第二个字符时,我没有得到错误,但没有得到任何结果。为此,您应该在查询之前检查代码,这似乎是另一个问题,尊重您的原始问题是的。对。我会分开发。这是一个新问题。我只是讨厌解决一个问题,却被介绍给下一个…*叹气。再次感谢你的帮助。