1

次のようなネストされた配列があります。

array(3) { 
[1]=> array(5) { 
    ["firstname"]=> string(2) "john" 
    ["name"]=> string(2) "dorian" 
    ["email"]=> string(2) "john@example.something" 
    ["sex"]=> string(1) "m" 
    ["size"]=> string(1) "L" } 
[2]=> array(5) { 
    ["firstname"]=> string(2) "Sam" 
    ["name"]=> string(2) "Stuard" 
    ["email"]=> string(2) "sammy@some.thing" 
    ["sex"]=> string(1) "m" 
    ["size"]=> string(1) "S" } 
[3]=> array(5) { 
    ["firstname"]=> string(2) "vanessa" 
    ["name"]=> string(2) "sherbatzky" 
    ["email"]=> string(2) "vanessa@bla.bla" 
    ["sex"]=> string(1) "w" 
    ["size"]=> string(3) "S" } }

最も外側の配列 ( [1]、[2]、[3] ) の数は変更できます。

私は次のようなもので試しました

$columns = implode(", ",array_keys($insData));
$escaped_values = array_map('mysql_real_escape_string', array_values($insData));
$values  = implode(", ", $escaped_values);
$sql = "INSERT INTO `user`($columns) VALUES ($values)";

しかし、私はそれを取得しませんでした。:/

4

3 に答える 3

1

関数はmysql_非推奨です。新しいコードには使用しないでください。またはのいずれmysqliかを使用しますPDO

配列を反復処理し、行を 1 つずつ挿入します。複数の行を挿入するための (準備された) ステートメントを作成することもできますが、データベースに慣れていない場合は、基本から始めて、そこから構築する方がよいでしょう。

// Create a new connection, see the manual on the details
$conn = new PDO(/* see PHP manual for the params*/);

// Start a new transaction. All MySQL storage engines don't support transactions,
// so this step might be superfluous. Check your schema definition and the 
// MySQL manual.
$conn->beginTransaction()

// Create a prepared statement
$stmt = $conn->prepare("INSERT INTO user (firstname, name, email, sex, size) VALUES (:firstname, :name, :email, :sex, :size)");

try {
    foreach ($insData as $dataset) {
        foreach ($dataset as $colname => $value) {
            // Bind values for the placeholders in the prepared statement
            $stmt->bindValue(":" . $colname, $value);
        }

        // Run your query
        $stmt->execute();
    }

    // Commit the changes pending in the transaction
    $conn->commit();
} catch (PDOException $e) {
    // Rollback all statements in the transaction on errors
    $conn->rollback();
}

ステートメント全体を動的に作成する必要がある場合は、それも可能です。クエリの列部分を作成するための追加の手順が 1 つ必要です。

于 2013-03-01T22:10:22.090 に答える
0
$columns = array_keys($insData[0]);
$values = "";
foreach($insData as $data)
   $values.= "(".$data['firstname'].",".$data['name'].",etc ."),";

挿入値セクションの括弧を省略します

于 2013-03-01T22:00:54.863 に答える
0
$columns = array();
$values = array();    

foreach($insData as $row)
{
    foreach($row as $columnName => $columnValue)
    {
        $columns[] = $columnName;
        $values[] = $columnValue;
    }

    // Build query
    $query = "INSERT INTO `user` (" . implode(",", $columns) . ") VALUES (" . implode(",", $values) . ")";

    // DO INSERT HERE (PREFERABLY WITH PDO OR MYSQLI)   

    // Reset columns/values
    $columns = array();
    $values = array(); 
}
于 2013-03-01T22:02:36.570 に答える