2010-12-18 8 views
0
function fetchbyId($tableName,$idName,$id){ 
     global $connection; 
     $stmt = mysqli_prepare($connection, 'SELECT * FROM ? WHERE ? = ?'); 
     var_dump($stmt); 
     mysqli_stmt_bind_param($stmt,'s',$tableName); 
     mysqli_stmt_bind_param($stmt,'s',$idName); 
     mysqli_stmt_bind_param($stmt,'i',$id); 
     $stmt = mysqli_stmt_execute($stmt); 
     mysqli_stmt_bind_result($name,$id); 
     $fetchArray = array(); 
     while($row = mysqli_stmt_fetch($stmt)){ 
      $fetchArray[] = $row; 
     } 
     return $fetchArray; 
    } 

テーブル名にプレースホルダを使用することはできますか?これはテーブルの列に対してのみ可能ですか?mysqlは文を準備しましたが、これは可能ですか?

+0

それはどちらの列にもできません。それはあなたが構築しようとしている非常に役に立たない機能です。それは3単語を入力することからあなたを保存しますが、あなたのコードを読みにくくするでしょう。 –

+0

これは '$ data = getRow(" SELECT * FROM table WHERE id =? "、$ id);' –

+0

@Colのように実行される汎用関数です。 Shrapnel:残念ながら、このソリューション(getRow)はデータベースの抽象化を奪います。 XMLまたはオブジェクトストレージに切り替えることは、痛みを伴うでしょう... – netcoder

答えて

1

いいえ、エスケープされるため、値(列、表名、スキーマ名、および予約語ではありません)のみを受け入れます。あなたはこれを行うことができます:

$sql = sprintf('SELECT * FROM %s WHERE %s = ?', $tableName, $idName); 
$stmt = mysqli_prepare($connection, $sql); 
mysqli_stmt_bind_param($stmt,'i',$id); 
1

いいえ、できません。表と列の名前は構文、値はデータです。構文をパラメータ化することはできません。

テーブル/列名は、実績のある有効なテーブル/列名のセット(、右?)からのものであるため、文字列に直接挿入できます。ユーザ提供の値のみがパラメータでなければなりません。

function fetchbyId($tableName,$idName,$id){ 
    global $connection; 
    $stmt = mysqli_prepare($connection, "SELECT * FROM $tableName WHERE $idName = ?"); 
    mysqli_stmt_bind_param($stmt,'i',$id); 
    $stmt = mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($name,$id); 
    $fetchArray = array(); 
    while($row = mysqli_stmt_fetch($stmt)){ 
     $fetchArray[] = $row; 
    } 
    return $fetchArray; 
} 
+0

"ユーザー指定の値のみがパラメータでなければなりません" - 間違ってはいけません。 –

+0

@ Col.Shrapnel: "制御された環境から来た値"とは対照的です。私が言ったことはないことに注意してください* "ユーザーが提供していない値はパラメータであってはいけません" *。しかし、たぶんあなたは私に、なぜ私が間違っているのではなく、ダウンボートを正当化することができないのかを私に説明します。 – Tomalak

+0

"制御された環境"にもアポストロフィとヌルがあります。準備されたステートメント** ARE **は、データの起源を考える開発者**ではない**ように設計されています。 Go figure –

関連する問題