3

mysql テーブルに格納される配列でデータを受け取ります。テーブルのフィールド名はkey配列内のキーと値のペアと同じですが、どのキーと値のペアが到着するかは事前にわかりません

// First execution
$array1 = array('a'=> 'str1', 'b'=> 'str2', 'c'=> 'str3', 'd'=> 'str4');

// second execution
$array2 = array('a'=> 'str6', 'c'=> 'str7', 'e'=> 'str5');

// third execution
$array3 = array('b'=> 'str8', 'd'=> 'str9', 'e'=> 'str10');

したがって、上記はデータが到着する方法を示しています。以下は、db テーブル構造の例です。

column 1 name = id (auto increment)
column 2 name = 'a'
column 3 name = 'b'
column 4 name = 'c'
column 5 name = 'd'
column 6 name = 'e'
column 7 name = 'f'

予期しないデータが存在する可能性があることに注意してください。ただし、その予期しない値のデータベース フィールド (列) が存在しない場合は、データをスキップする必要があります。基本的に、列が存在するデータを挿入する必要があり、存在しない値は列に対して null にする必要があります。これが誰かにとって意味があることを願っています。

PHPでSQLを構築するにはどうすればよいですか?

4

2 に答える 2

1

配列キーから列名のリストを作成し、配列値から値のリストを作成できます。何かのようなもの:

$keys = array_keys($arr);
$vals = array();
foreach ($keys as $k)
{
    $vals[] = "'".mysql_real_escape_string($arr[$k])."'";
}
$qry = "INSERT into tab1 (".implode(',', $keys).") VALUES (".implode(',', $vals).")";

ただし、テーブルにないキーを削除する方法を見つける必要があります。DESCRIBE TABLES を使用するという GordonM のアイデアは、おそらく行くべき道だと思います。次に、$keys をフィルター処理します (列名のリストを取得したら、array_intersect() を使用します)。

于 2012-05-15T12:36:53.990 に答える
0

Zend Framework の一部である Zend_Db_Table を使用できます。http://framework.zend.com/manual/en/zend.db.table.html ライブラリとして使用できることに注意してください。フレームワークを使用する必要はありません。Zend_Db_Table には、テーブルのメタデータを取得するためのメソッドがあるため、配列を簡単にフィルター処理できます。また、メタデータをキャッシュする機能も提供します。

簡単な例:

$db = new Zend_Db_Adapter_Pdo_Mysql(array(
    'host'     => 'localhost',
    'username' => 'test',
    'password' => 'test',
    'dbname'   => 'test'
));
Zend_Db_Table::setDefaultAdapter($db);
$table = new Zend_Db_Table('table_name');    
$info = $table->info();

// assuming array1 contains keys => values    
$arr = array_intersect_key($array1,array_flip($info['cols']));    
$table->insert($arr);
于 2012-05-15T13:37:57.177 に答える