2012-03-16 8 views
0

私はこのコード(働いていた)があります。プリペアドステートメントの問題

if (isset($_POST['plant_name']) && $_POST['plant_name']) { 
$where .= "AND (common_name) LIKE '".strtolower($_POST['plant_name']) . "' OR (latin_name) LIKE '".strtolower($_POST['plant_name'])."%' "; 
} 

をしかし、私は準備された文にそれを変更したいと私の試みは以下の通りですが、私はエラーを取得しています:

$plant_name = $_POST['plant_name']; 

if (isset($_POST['plant_name']) && $_POST['plant_name']) { 
$stmt = $conn2->prepare . $where .= "AND (common_name) LIKE '".'?'. "' OR (latin_name) LIKE '".'?'."%' "; 
} 

$stmt->bind_param('s', $plant_name); 

$stmt->execute(); 

でした

Notice: Undefined property: mysqli::$prepare 

Fatal error: Call to a member function bind_param() on a non-object 
:誰かが私のエラーがある

を私にしてください助けてください210

+2

エラーが発生した場合は、その内容を教えてください。そうすれば、私たちはより良いお手伝いをすることができます。 – Crashspeeder

答えて

3

EDIT:私のせいではなく、mysqliを使用しています。残念ながら、mysqliは名前付きパラメータをサポートしていません。

元の例では、プロパティのように$conn2->prepareを扱っていますが、それは関数です。

このお試しください:

$statement = $conn2->prepare(
"UPDATE tablename SET 
    field1 = :value1, 
    field2 = :value2 
WHERE common_name LIKE :plant_name 
OR latin_name LIKE :plant_name 
"); 
$statement->bindValue('value1', $_POST['field1']); 
$statement->bindValue('value2', $_POST['field2']); 
$statement->bindValue('plant_name', strtolower($_POST['plant_name'])); 
:ここではPDOの方法は(私はそれが多くのクリーナーだと思うが、それはあなたのため、この時点で、おそらくPDOにmysqliのから変更する価値はありません)です

// Presumably by this point you have a $sql and a $where that you're appending to. 
if (isset($_POST['plant_name']) && $_POST['plant_name']) { 
    $where .= "AND (common_name) LIKE ? OR (latin_name) LIKE ?"; 
} 
$stmt = $conn2->prepare($sql . $where); 
if (isset($_POST['plant_name']) && $_POST['plant_name']) { 
    $stmt->bind_param('s', strtolower($_POST['plant_name'])); 
    $stmt->bind_param('s', strtolower($_POST['plant_name'])."%"); 
} 

注これについていくつかのこと:

  1. I ?(数値でインデックスされたプレースホルダ)を:name(名前ベースのプレースホルダ)に切り替えました。両方のフィールドを検索するのに同じ値を使用しているので、パフォーマンスの向上は非常に小さくなり、SQLをもっと読みやすくします。
  2. バインドされたパラメータの前後に引用符を付ける必要はありません。バインドされたパラメータの利点の1つは、引用符でエスケープする必要がないことです。 SQLは、パラメータ値とは別のチャネルで送信されます。したがって、SQLインジェクションの機会はありません。データベースはバインドされたパラメータに注目し、バインドされたパラメータのデータを参照して、それ自体で正しい値を読み取ります。
+0

このメイトにありがとうございますが、私は今このエラーが発生しています:致命的なエラー:定義されていないメソッドを呼び出すmysqli :: bindValue() – user1227124

+0

改訂版を参照してください、あまりにもコメント=) – MightyE

+0

私はPDOだと思った。ありがとうございました。私は苦痛ではありませんが、今では2つのエラーを取得していません:未定義の変数:SQLと非オブジェクト上のメンバー関数bind_param()への呼び出し – user1227124

関連する問題