2016-04-27 6 views
0

PHPで動的クエリを作成しています。準備中の動的mysqlクエリ

#$id = $_POST[id]; 
#$field1 = $_POST[field1]; 
#$field2 = $_POST[field2]; 
#$field3 = $_POST[field3]; 

$id = "id"; 
$field1 = "222"; 
$field2 = "787"; 
$field3 = "4444444"; 

$whereArr = array(); 
if($id != "") $whereArr[] = "id = {$id}"; 
if($field1 != "") $whereArr[] = "field1 = {$field1}"; 
if($field2 != "") $whereArr[] = "field2 = {$field2}"; 
if($field3 != "") $whereArr[] = "field3 = {$field3}"; 

$whereStr = implode(" AND ", $whereArr); 

$query = "Select * from assignments WHERE {$whereStr}"; 
echo $query; 

正常です。

Select * from assignments 
WHERE id = id AND field1 = 222 AND field2 = 787 AND field3 = 4444444 

私は正しいクエリを取得していますが、mysqlはもはや維持されません。だから、私はこのような準備文を使用しています。

$firstname = 'Patrick'; 
$lastname = 'Allaert'; 

$query = 'SELECT * FROM users'; 

$cond = array(); 
$params = array(); 

if (!empty($firstname)) { 
    $cond[] = "firstname = ?"; 
    $params[] = $firstname; 
} 

if (!empty($lastname)) { 
    $cond[] = "lastname = ?"; 
    $params[] = $lastname; 
} 

if (count($cond)) { 
    $query .= ' WHERE ' . implode(' AND ', $cond); 
} 
echo $query; 

問題はどのようにパラメータをバインドできますか。

$stmt->bind_param("sss", $firstname, $lastname, $email); 

あなたのアドバイスをありがとう。スクリプト内

+0

なぜあなたは、配列を使用していますか!? –

+0

実行時に '$ params'を渡すことができます。 ( '$ email'はあなたのコードには現在ありませんが、これはちょうど短縮バージョンです)。 – chris85

+0

@ chris85例を挙げれば助かります/ – Ironic

答えて

0

配列の必要は

あなたは、以下のようなスクリプトを使用することができます。

$where = " 1=1"; 
if($id != "") $where .= " and id = $id "; 
if($field1 != "") $where .= " and field1 = '" . $field1 . "' "; 
if($field2 != "") $where .= " and field2 = '" . $field2 . "' "; 
if($field3 != "") $where .= " and field3 = '" . $field3 . "' "; 

$query = "Select * from assignments WHERE $where"; 
echo $query; 
+0

これは準備されたステートメントの仕組みではありません。これも無効なSQLです。 – chris85

+0

なぜその無効な文@ chris85? –

+0

'$ firstname = 'Patrick';' $ lastname = 'Allaert'; 'これらは引用符で囲む必要がある文字列です。質問は準備されたステートメントに関するものですが、この全体のアプローチは間違っています。またはコードの最初のチャンクを書き直そうとしている場合は、 'それは正常に動作しているため、不要です。 OPはより安全な準備済みのステートメントに更新しています。 – chris85

1

あなたはexecuteに配列を渡すことができますし、それはその配列の値をバインドします。

$firstname = 'Patrick'; 
$lastname = 'Allaert'; 

$query = 'SELECT * FROM users'; 

$cond = array(); 
$params = array(); 

if (!empty($firstname)) { 
    $cond[] = "firstname = ?"; 
    $params[] = $firstname; 
} 

if (!empty($lastname)) { 
    $cond[] = "lastname = ?"; 
    $params[] = $lastname; 
} 

if (count($cond)) { 
    $query .= ' WHERE ' . implode(' AND ', $cond); 
} 
$stmt = $pdo->prepare($query); 
$stmt->execute($params); 

このアプローチは、例#3のようにマニュアルに記載されています。 http://php.net/manual/en/pdo.prepared-statements.php

のMysqliアプローチ:

$firstname = 'Patrick'; 
$lastname = 'Allaert'; 
$query = 'SELECT * FROM users'; 
$cond = array(); 
$params = array(); 
if (!empty($firstname)) { 
    $cond[] = "firstname = ?"; 
    $params[] = $firstname; 
} 
if (!empty($lastname)) { 
    $cond[] = "lastname = ?"; 
    $params[] = $lastname; 
} 
if (count($cond)) { 
    $query .= ' WHERE ' . implode(' AND ', $cond); 
} 
$stmt = $mysqli->prepare($query); 
if(!empty($params)) { 
    $n = count($params); 
    $a_params[] = & str_repeat('s', $n); 
    for($i = 0; $i < $n; $i++) { 
     $a_params[] = & $params[$i]; 
    } 
    call_user_func_array(array($stmt, 'bind_param'), $a_params); 
} 
$stmt->execute(); 
$res = $stmt->get_result(); 
while($row = $res->fetch_array(MYSQLI_ASSOC)) { 
    print_r($row); 
} 
+0

おかげさまでChris85。確認してお知らせします。投票した。 – Ironic

+1

ああ、これは 'pdo'ではなく' mysqli'を使っていますよね?もしこのアプローチを見たいのであれば、http://stackoverflow.com/questions/32574016/search-exact-keywords/32575326#32575326。 'execute'関数は、配列をmysqliマニュアルのバインドされたパラメータとみなしているわけではありません。 – chris85

+0

私はその質問をチェックしましたが、私はanywareバインドパラメータが見つかりませんでした。あなたがもう少し説明すれば、それはすばらしいでしょう。 – Ironic

関連する問題