2017-03-15 10 views
0

$mysqli->prepareステートメントを作成しようとしていますが、値としてPOSTの値を使用する代わりに、それらを使用して更新中の要素を選択します。配列は、前のページの複数の選択されたhtml項目のセットに由来します。POST配列を使用してmysqlクエリの要素を選択する

foreach($_POST['times'] as $val){ 

    if(!($stmt = $mysqli->prepare("UPDATE stud_sched SET ? ='a' WHERE s_id = (?)"))) { 
     echo "Prepare failed: " . $stmt->errno . " " . $stmt->error; 
    } 
    if(!($stmt->bind_param("sd",$val, $pid))){ 
     echo "Bind failed: " . $stmt->errno . " " . $stmt->error; 
    } 
    if(!$stmt->execute()){ 
     echo "Execute failed: " . $stmt->errno . " " . $stmt->error; 
    } 
     $stmt->close(); 
} 

しかし、私は次のように取得しています:

Notice: Trying to get property of non-object in /nfs/stak/students/s/searsjo/public_html/student_added.php on line 107 (the bind statement)

Prepare failed: Fatal error: Call to a member function bind_param() on boolean in /nfs/stak/students/s/searsjo/public_html/student_added.php on line 109

これは私が行うことができるはず何かのように思えるが、私はそれについてのすべての情報を見つけることができません。誰でも何か提案がありますか?

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

+0

フィールド名をバインドすることはできません。 –

答えて

0

official documentationには、列名を変数/値にバインドできるとは記載されていません。 interesing commentによれば、たとえば、in_arrayを使用して、クエリで許可された列名をホワイトリストにすることをお勧めします。したがって、コードは次のようになります。

foreach($_POST['times'] as $column){ 

    if(!in_array($column, array('someColumn', 'someOtherColumn', 'yetAnotherColumn'))) 
    { 
     die("Column not permitted in query"); 
    } 

    if(!($stmt = $mysqli->prepare("UPDATE stud_sched SET $column ='a' WHERE s_id = (?)"))) { 
     echo "Prepare failed: " . $stmt->errno . " " . $stmt->error; 
    } 

    if(!($stmt->bind_param("s",$pid))){ 
     echo "Bind failed: " . $stmt->errno . " " . $stmt->error; 
    } 

    if(!$stmt->execute()){ 
     echo "Execute failed: " . $stmt->errno . " " . $stmt->error; 
    } 

    $stmt->close(); 
} 
+0

完璧に作業しました! – Dagrik

+0

喜んで:) –

関連する問題