0

検索して検索していますが、問題が見つかりませんでした。助けていただければ幸いです。

「警告: mysqli_stmt::bind_param(): 変数の数が、24 行目の "mydir" の準備されたステートメントのパラメーターの数と一致しません」

<?php
class Tunier {

    // name of Tunier
    protected $tunier_name;
    // count of participants
    protected $participant_count;

    function __construct($name, $participant) {
        // mysqli connection
        $db = new mysqli('localhost','root','','tuniere') or die ('Cant connect to MySql Please try later again');

        $this->tunier_name = $name or die('---');
        $this->participant = $participant or die('---');

        // einrichtung der Tabelle
        $query = 'CREATE TABLE `?`(
                                                    `?` VARCHAR(32) PRIMARY KEY NOT NULL,
                                                    `?` INT(2) NOT NULL,
                                                    `id_spieler` INT(10) NULL                            
                                                    );';

        $stmt = $db->prepare($query);        
        $stmt->bind_param('sss', $this->tunier_name, $this->tunier_name, $this->participant_count);
        $stmt->execute();
    }
}
?>
4

2 に答える 2

3

準備済みステートメント機能を誤用していると思います。バインド パラメーターは、クエリにデータ (数値、リテラル文字列など) を挿入するためのものであり、演算子、識別子、またはキーワードを挿入するためのものではありません。信頼できないソースからの SQL コマンドを受け入れる場合、SQL インジェクションから保護する方法はありません。つまり、テーブルまたは列の名前を bind parameters として渡すことはできません

SQL パーサーは、すべての?シンボルをやみくもに置き換えるだけではなく、状況依存のツールです。結果として、これは:

`?`

...はプレースホルダーではなくリテラル識別子と見なされるため、エラーになります。

たとえば、次のコードでは:

SELECT *
FROM `?`
WHERE foo=? OR bar='?' OR dot='How are you doing?'

... 最大 まで?のシンボルがありますが、foo=?コードが SQL として解析される場合?、リテラル値が期待される場所に配置されるのはそれだけであるため、パーサーは にあるもののみをプレースホルダーとして扱います。そう:

  1. パラメータを1 つ渡した場合にのみ、コードが実行されます。
  2. というテーブルがない場合、クエリの入力は失敗します?
于 2013-04-27T07:34:38.977 に答える
0

bind_param()あなたの必要はありませんtable_name

に変更Integer type_participant_countbind_param()

$stmt->bind_param('ssi', $this->tunier_name, $this->tunier_name, $this->participant_count);
于 2013-04-27T07:35:21.357 に答える