2009-08-29 14 views
9

次のクエリを実行しようとしていますが、ワイルドカードに問題があります。準備済みの文でワイルドカードを使用する - MySQLi

function getStudents() { 
     global $db; 
     $users = array(); 
     $query = $db->prepare("SELECT id, adminRights FROM users WHERE classes LIKE ? && adminRights='student'"); 
     $query->bind_param('s', '%' . $this->className . '%'); 
     $query->execute(); 
     $query->bind_result($uid, $adminRights); 
     while ($query->fetch()) { 
      if (isset($adminRights[$this->className]) && $adminRights[$this->className] == 'student') 
       $users[] = $uid; 
     } 
     $query->close(); 
     return $users; 
    } 

次のようなエラーが表示されます。パラメータ2を参照渡しできません。ワイルドカードを使用する理由は、列のデータにシリアル化された配列が含まれているためです。私は、これを処理する簡単な方法があれば、私は何ができるのだろうか?

ありがとうございます!

+0

[ SQLのようなステートメントの問題](http://stackoverflow.com/questions/618527/sql-like-statement-problems) – outis

答えて

16

を試してみてください。しかし、渡すためにこのような変数を組み立てることはできません。

$className = '%' . $this->className . '%'; 
$query->bind_param('s', $className); 
5

パラメータ#2は、値ではなく、参照でなければなりません。あなたは単一の変数(ない連結した文字列)を渡す必要が意味し、参照することによりbind_param()にパラメータを渡す必要があり

$param = '%' . $this->className . '%'; 
$query->bind_param('s', $param); 
+0

マニュアルの最初の文章は次のように修正しています: "変数をパラメータとして準備文にバインドする" ) – Zed

0

これはC++で起こるのと同じ理由です。引数を参照にすることを期待する関数に値を渡すときは、変数(一時的ではない)が必要です。最初に変数を作成して渡します。

$sql = mysql_query("SELECT * FROM `products` WHERE `product_title` LIKE '$userInput%'") or die(mysq_error()); 

そしてそれはすべての時間を仕事:

-4

既存の答えはそう、これは私が代わりに使用したものである私のために動作しませんでした。

とちょうどそれ私は単純な形を試してみました、それは私はこれはこれを行うには

+1

2番目のクエリは危険であり、SQLインジェクション攻撃に対して開かれているため***を使用しないでください。 – zzzzBov

+1

何をするべきではないかの完全な例。 –

7

別の方法があるのに役立ちます願ってい

$sql = "SELECT * FROM `products` WHERE `product_title` LIKE '%".$userInput."%'"; 

を働いたすべてのトップに:

SELECT id, adminRights FROM users 
    WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student' 

これがあると場合は、動的な結果のバインドを持って、SQLクエリを変更したいだけの場合に便利...

関連する問題