2017-04-10 119 views
0

我正在使用PDO来运行此查询,有没有办法查看查询是否返回false?以及为什么我的查询在我期望得到结果时什么都不返回LIKE in SQL is not working

   $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); 
       } 

我VAR dumpped的$searchby$searchval,他们似乎没什么问题,没打字错误或任何责任。

+0

你需要这样的“姓名”你忘了把单个配额 –

+1

永远记得好像是这个样子“%searchval%”在一个真正的查询 –

+0

它是“'%'{$ searchval} '%''或'''%{$ searchval}%'“'?我尝试了两个,但似乎没有任何工作 – Axis

回答

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"; 
    } 
?> 
0

您的代码有几个问题。

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

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

WHERE ? LIKE ? 

在一份声明中,你必须查询提供的字段名称。所以,你可以有

WHERE address LIKE ? 

但首先解决的异常处理,因为这将使你获得实际的错误信息。