2017-04-02 14 views
0

PHPを使用してMySQLデータベースからデータを取得するには、アプリケーションでWebサービスを作成する必要があります。私がPHPに慣れていないので、私がやりたいことがうまくいくかどうかわかりません。ここにコードです:PHP MySQLバインディングステートメントの状況

$queryString = "SELECT uniqueID, address FROM main WHERE (state = ?) AND (propType IN (?)"; 
$stmt = mysqli_prepare($this->connection, $queryString);  
mysqli_stmt_bind_param($stmt, 'ss', $itemst, $itempt); 
mysqli_stmt_execute($stmt); 

私の質問は、私のデータベースのpropType列のバインドステートメントと関係がある。私のアプリケーションでは、ユーザーがチェックボックスをクリックして検索することができる8種類のプロパティの種類があります。私がしたいのは、上記の$ itemptで表現された値に文字列をつなぎ、この単一の文字列をSQL文にバインドすることですが、これを行うことができるかどうかはわかりません。

私は、その後、私のような何かをすることはできません場合は、以下:私は選択されたプロパティの種類をテストし、思い付くする必要があるため

$queryString = "SELECT uniqueID, address FROM main WHERE (state = ?) AND (propType IN (?,?,?,?,?,?,?,?)"; 

これは、バインディング式に複雑に得ることができますさまざまな異なるクエリ/バインディング式があり、面倒な作業になります。

私の質問は、 "IN"節で、すべての文字列値を1つのコンマ区切り文字列に縫い合わせてから、この単一の値を自分のクエリにバインドするか、可能な値ごとに個別の変数を作成し、個別にバインドしますか?

ありがとうございました!

答えて

0

PDOスタイルでスニペットを書き直してテストしたので、私の答えを編集しました(別のテーブルスキーマで)。ので、あなたの応答に少し研究をしなければならなかった、

$servername = "localhost"; 
$username = "user"; 
$password = "pass"; 
$db = "stackoverflow"; 

try{ 
    $con = new PDO("mysql:host=$servername;dbname=$db", $username, $password); 
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // set this if you want to bind LIMIT values 

}catch(PDOException $e){ 
    $error = "Connection failed: " . $e->getMessage(); 
} 

$itemst = ['active']; // cast search parameters as array so you can merge them 
// watch the order in which you bind them! Else you will never find matching entries 
$container = ['some title 1','some title 3','some title 5']; 
$limit = [0,2]; 
$params = array_values(array_merge($itemst,$container,$limit)); 
$bindStr = implode(",", array_map(function($val) { return "?"; }, $container)); 
$queryString = "SELECT course_title FROM mysqli_quick WHERE state = ? AND course_title IN ({$bindStr}) LIMIT ?,?"; 

$stmt = $con->prepare($queryString); 

$stmt->execute($params); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
var_dump($result); 

プリント

array (size=3) 
    0 => 
    array (size=1) 
     'course_title' => string 'some title 1' (length=12) 
    1 => 
    array (size=1) 
     'course_title' => string 'some title 3' (length=12) 
+0

私はPHPに新しいですが、このソリューションは、私に華麗になります

はここにあります。私が正しく理解していれば、検索パラメータの配列をPHPに渡す必要があります。これらのパラメータは、検索パラメータの数に一致する疑問符の文字列にマップされ、それらをループして各値を個別にバインドします。これは正しいです?これは整数ではなく文字列の配列でも動作しますか? – sax

+0

はい、ありがとうございます。文字列を使用することもできます。 – Yolo

+0

あなたのソリューションは有効な解決策に見えますが、mysqliでは、あなたが提案する方法で複数のステートメントにパラメータをバインドできるようには見えません。 "mysqli_stmt_bind_param():変数の数がプリペアドステートメントのパラメータの数と一致しません"というエラーが表示されます。提案する方法で複数のステートメントにパラメータをバインドすることができますか? – sax