2017-04-04 14 views
1

私は1つのパラメータをバインドすると動作していたボタンを押してもSQL文を削除しようとしていますが、delete.phpを汎用的にしたいこの結合を実行PHP - 複数のbind_paramsが失敗する

<?php 
include "header.php"; 
include "db.php"; 

$_POST['table'] = "customer"; 
$_POST['column'] = "cID"; 
$_POST['del_id'] = 26; 

if(isset($_POST['del_id'])) 
{ 
    if ($stmt = $conn->prepare("DELETE FROM customer WHERE ? = ?")) 
    { 
     $stmt->bind_param('si', $_POST['column'], $_POST['del_id']); 
     $stmt->execute(); 
    } 
    else echo("Oops"); 
} 

をけれども)テーブルに何もしない、唯一の最終値「del_id」を結合、正しく実行し、テーブル名を含む3つの引数を結合、ちょうど(準備原因:別のテーブルを参照します失敗する。

私はAJAX POSTから他の場所に_POST変数を設定していますが、上記はこのビットが動作するかどうかをテストするためのものです。私はまた、それが始まる前にまだ検証をやり遂げることに拍車をかけていません。

非常にPHPのnooby、おそらく単純な間違い、または私が気付いていないことです。この場合、テーブル/カラム名をパラメータ化できない理由については興味があります。私はしばらくの間、回避策として、複数の異なる場所から動的な名前をこのクエリにドロップできるようにするには、何らかの連結形式が代わりに使用されますか?あなたは準備文のための連結およびパラメータの組み合わせを持っている必要があります。この達成する

+2

カラム名とテーブル名もバインドできません。 –

答えて

0

削除を実行する前に、テーブル名と列名の両方を検証する必要があります。

テーブル名またはカラム名のいずれも準備できないため、準備の前にSQL文に入力してください。

<?php 
    include "header.php"; 
    include "db.php"; 

    $_POST['table'] = "customer"; 
    $_POST['column'] = "cID"; 
    $_POST['del_id'] = 26; 

    // Add code to prevent SQL injection 
    $table = $_POST['table'] == 'customer' ? $_POST['table'] : ''; 
    $column = $_POST['column'] == 'customer' ? $_POST['column'] : ''; 

    if(isset($_POST['del_id']) && $table != '' && $column != '') { 
     if ($stmt = $conn->prepare("DELETE FROM `".$table."` WHERE `".$column."` = ?")) 
     { 
      $stmt->bind_param('i', $_POST['del_id']); 
      $stmt->execute(); 
     } 
     else echo("Oops"); 
    } 
+0

ありがとう!あなたがテーブル/カラム名を準備できなかったことを知らなかった。 – kingtaco

0

はい、:

if ($stmt = $conn->prepare("DELETE FROM " . $_POST['table'] . " WHERE " . $_POST['column'] . " = ?")) 
    { 
     $stmt->bind_param('si', $_POST['del_id']); 
     $stmt->execute(); 
    } 

はあなたがテーブル名や列名に必要となる追加の検証に注意を払っていることを確認します。これは、有効な識別子を確認するだけでなく、データモデルに対して検証する必要があります。さらに、このアイデアを詳しく説明する方法については、ORM /クエリビルダーをご覧ください。それは良い学習の練習です。

関連する問題