2017-04-10 4 views
0

このクエリを実行するのにPDOを使用していますが、クエリがfalseを返すかどうかを確認する方法はありますか?なぜ私の結果が期待されるときに私のクエリが何も返さないのですか?SQLのLIKEが機能しない

   $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が$searchby$searchvalをdumpped、彼らは一切のミスタイプか、私には細かいようです。

+0

あなたはこのLIKE「名前」のような何かに必要なあなたは –

+1

は、常に実際のクエリで、この「%searchval%」のように見えているように覚えて、単一のクォータを置くことを忘れ –

+0

ですそれ '"% '{$のsearchval} '%'または '"'%{$ searchval}% '" '?私は両方を試みたが、何も動かないようだ。 – Axis

答えて

0

クエリに問題がここにある:where後プレースホルダ

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

句は私がに基づいて$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は広範な例外処理を提供しています(PDO Exception Questions - How to Catch Themここでの質問を参照)。

これは、プリペアドステートメントのフィールド名の代わりにパラメータを使用できないことを示しています。どうして?準備文が動作する仕組みは、MySQLがそれらをコンパイルして実行計画を作成することです。フィールドまたはテーブルがコンパイル時に分からない場合、MySQLは実行計画を準備することもできません。これは、あなたが準備された文で

WHERE ? LIKE ? 

を持つことができないことを意味し、あなたはクエリでフィールド名を指定する必要があります。したがって、あなたは持っていることができます

WHERE address LIKE ? 

しかし、実際のエラーメッセージを得ることができるので、まず例外処理を修正してください。

関連する問題