0

フォームに入力されたデータを取得し、それを配列に格納してからデータベースに入力するコードの一部があります。$fields と $data で var_dump を使用しましたが、どちらも (add_habbo 関数で) フィールドに入力された情報を返しています。私が抱えている問題は、MYSQL/PDO コードがこのデータをデータベースに挿入していないことです。

これは、データベースに挿入するために使用しているコードです。

    $fields = '`' . implode('`, `', array_keys($habbo_data)) . '`';
    $data   = '\'' . implode('\', \'', $habbo_data) . '\'';

    var_dump($fields);
    var_dump($data);

    global $con;

    $query = "INSERT INTO `personnel` (:fields) VALUES (:data)";
    $result = $con->prepare($query);
    $result->bindParam(':fields', $fields, PDO::PARAM_STR);
    $result->bindParam(':data', $data, PDO::PARAM_STR);
    $result->execute();

bindParam セクション、おそらく PDO::PARAM_STR? に何か関係があるような印象を受けます。ご協力ありがとうございます。

アップデート:

$fields = '`' . implode('`, `', array_keys($habbo_data)) . '`';
$fields_data   = ':' . implode(', :', array_keys($habbo_data));

var_dump($fields);
var_dump($fields_data);

global $con;

$query = "INSERT INTO `personnel` (`rank`, `habbo_name`, `rating`, `asts`, `promotion_date`, `transfer_rank_received`, `cnl_trainings`, `rdc_grade`,
    `medals`, `branch`) VALUES ({$fields_data})";
$result = $con->prepare($query);
$result->execute($habbo_data);

$arr = $result->errorInfo();
print_r($arr);

エラー:

配列 ([0] => 21S01 [1] => 1136 [2] => 列数が行 1 の値数と一致しない)

4

2 に答える 2

1

プリペアド ステートメントは、コピー アンド ペーストと同じではありません。

INSERT INTO `personnel` (:fields) VALUES (:data)

:dataここでは、 1 つのフィールド ( )に正確に 1 つのデータ ( ) を挿入することを PDO/MySQL に伝えています:field。値は、コンマで区切られた複数の値ではなく、コンマを含む1 つの文字列です。

さらに、フィールド名などの構造情報ではなく、 dataのみをバインドできます。次のようなクエリを作成する必要があります。

INSERT INTO `personnel` (foo, bar, baz) VALUES (?, ?, ?)

次に、データを 3 つのプレースホルダーに個別にバインドします。

于 2013-07-04T16:48:59.403 に答える
0

それをしてはいけない:

  • 各変数/フィールド名と値を個別に追加する必要があります。
  • バインドできるのは値のみであり、テーブル名またはフィールド名はバインドできません。

テーブル名とフィールド名はSQLに直接注入する必要があるため、SQLインジェクションの問題を防ぐために、それを行う前にホワイトリストと照合する必要があります。

したがって、あなたの場合は次のようになります(ラフドラフト):

// assuming all fields have been checked against a whitelist
// also assuming that the array keys of `$habbo_data` do not contain funny stuff like spaces, etc.
$fields = '`' . implode('`, `', array_keys($habbo_data)) . '`';
$fields_data   = ':' . implode(', :', array_keys($habbo_data));

var_dump($fields);
var_dump($fields_data);

global $con;

$query = "INSERT INTO `personnel` ({$fields}) VALUES ({$fields_data})";
$result = $con->prepare($query);
$result->execute($habbo_data);

変数を手動でバインドするのではなく、連想配列をパラメーターとしてメソッドに$habbo_data直接送信することに注意してください。例 #2を参照してください。execute

于 2013-07-04T16:50:21.813 に答える