2017-04-10 211 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 ? 

但首先解決的異常處理,因爲這將使你獲得實際的錯誤信息。