SQL中的LIKE不起作用

时间:2017-04-10 08:14:21

标签: php mysql pdo sql-like

我正在使用PDO来运行此查询,有没有办法查看查询是否返回false?为什么我的期望结果时我的查询没有返回任何内容?

                $selectsql = "SELECT `firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE ? LIKE ?";
                $selectstmt = $conn->prepare($selectsql);
                $selectstmt->execute(array($searchby,"%{$searchval}%"));
                while($data = $selectstmt->fetch(PDO::FETCH_ASSOC)){
                  echo "
                  <tr>
                    <td>{$data['firstname']}</td>
                    <td>{$data['surname']}</td>
                    <td>{$data['phone']}</td>
                    <td>{$data['address']}</td>
                    <td>{$data['username']}</td>
                    <td>Delete Account</td>                    
                  </tr>
                  ";
                  var_dump($data);
                }   

我变换了$searchby$searchval,他们对我来说似乎很好,没有错误或任何错误。

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

第一个也是最大的问题是你假设你的查询是正确的,所以你不检查任何sql错误。 PDO提供了广泛的异常处理(请参阅此处的PDO Exception Questions - How to Catch Them问题)。

这将告诉您不能使用参数替换预准备语句中的字段名称。为什么?因为预处理语句的工作方式是MySQL编译它们并准备它们的执行计划。如果在编译时不知道字段或表,则MySQL也无法准备执行计划。这意味着你不能拥有

WHERE ? LIKE ?

在准备好的声明中,必须在查询中提供字段名称。所以,你可以拥有

WHERE address LIKE ?

但首先修复异常处理,因为这样可以让您获得实际的错误消息。

答案 1 :(得分:0)

您的查询存在问题:

$selectsql = "SELECT firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE ? LIKE ?";

where之后的占位符搞乱你的查询,在where子句之后应该有一个列名,我看到$searchby根据用户选择的项目进行更改。 你应该注意的一件事是:

  

表格和列名称不能被PDO中的参数替换。

您的查询应该如下。

<?php

$search = "%".$searchval."%";
$selectsql = "SELECT `firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE $searchby LIKE ?";
    $selectstmt = $conn->prepare($selectsql);
    $selectstmt->execute([$search]);
    $results = $selectstmt->fetch((PDO::FETCH_ASSOC));

    if(count($results) > 0){
      var_dump($results);
        foreach($results as $data):?>
          <tr>
              <td><?php echo $data['firstname'];?></td>
              <td><?php echo $data['surname'];?></td>
              <td><?php echo $data['phone'];?></td>
              <td><?php echo $data['address'];?></td>
              <td><?php echo $data['username'];?></td>
              <td>Delete Account</td>                    
        </tr>

      <?php
          endforeach;
    }else{

      echo "no results found";
    }
?>