2

ユーザーに関する非常に大きな情報の配列があるとします。

$user=array(
"name"=>"john",
"ip"=>"xx.xx.xx.xx",
"email"=>"john@something.com",
//lots more values
)

また、この情報を複数のテーブルに入れる必要があるとします。たとえば、usernameテーブルに移動する必要がある、テーブルusersに移動する必要があるなどです。addressdetails

今、特定の自作関数を使用して、配列キーを列名に、配列値を入力された値に一致させるテーブルに挿入します。これに似たもの:

function insert_sql($table, arr $values){
    GLOBAL $dbc;
    $sql="INSERT INTO `$table` (".implode(array_keys($values), ", ").") VALUES (".implode(array_values($values), ", ").")";
    $dbc->prepare($sql)->execute();
    return $dbc->lastInsertId();

}
//I don't actually use this function, just trying to show you what is being accomplished.

問題は、関数がすべてのキーすべての値を使用することです。そのため、配列の特定の部分を複数のテーブルに配置する必要がある場合、機能しません。

質問は:

列が存在しない場合、列を無視する INSERT ステートメントを作成するにはどうすればよいですか? したがってnameemail, address, を tableに挿入usersしても、このテーブルに住所列がない場合は、名前と電子メールを含む行を挿入する必要がありますが、住所列がないという事実を単純に無視します。

EDIT:他のオプションは、テーブルの列で配列を作成し、それを使用して値の配列をフィルタリングすることです。これを設定する方法はよくわかりませんが。

4

2 に答える 2

1

指定されたテーブルの列名を検索します。

SELECT 
column_name
FROM 
information_schema.columns
WHERE 
table_name =  'tablename'

そして、$values配列内のキーをホワイトリストに登録するだけです

例:

function insert_sql($table, array $values){
        global $connection;
        $query = "SELECT column_name FROM information_schema.columns WHERE table_name =  :tablename";
        /* @var $stmt PDOStatement */
        $stmt  = $connection->prepare($query);
        $stmt->execute(array(
            'tablename' => $table
        ));
        $columns = array_flip($stmt->fetchAll(PDO::FETCH_COLUMN, 0));
        $values  = array_intersect_key($values, $columns);
        var_dump($values);
    }
于 2013-01-10T00:41:08.927 に答える
1

列が存在しない場合、列を無視する INSERT ステートメントを作成するにはどうすればよいですか? したがって、テーブル users に名前、電子メール、アドレスを挿入しても、このテーブルにアドレス列がない場合は、名前と電子メールを含む行を挿入する必要がありますが、アドレス列がないという事実を単純に無視します。

できません

代わりに、個別の挿入を使用してデータを適切なテーブルにマップする必要があります。

于 2013-01-10T00:43:38.437 に答える