これは完璧ではありませんが、MySQLIを使用してSQLテーブルにデータを挿入する関数を作成しようとしています。私は、さまざまな種類のデータを異なるデータベースに挿入する汎用関数を作成したいと考えています。私はこれまでのところ次のようなことがあります:MYSQLIで指定されていない長さの配列を挿入
/**
* Add data to specified table. Data consist of column name as key, and value.
* Table is a string of the table to insert into.
* @param array $data
* @param string $table
* @return string
*/
private function insert($data = array(), $table = null){
foreach($data as $key => $value){
// Create arrays of separate keys and values
$keys[] = $key;
$values[] = $value;
// Get type of data
switch(gettype($value)){
case "integer":
$types[] = "i";
break;
case "string":
$types[] = "s";
break;
default:
$types[] = "i";
break;
};
// for each variable, add a questionmark
$vars[] = "?";
}
// Create strings out of the data
$key = implode(",", $keys);
$var = implode(",", $vars);
$type = implode("", $types);
$value = '"' . implode('\", \"', $values) . '"';
// prepare SQL statement
// var_dump($sql) = 'INSERT INTO table (var1,var2,var3) VALUES (?,?,?)'
$sql = "INSERT INTO " . $table . " (" . $key . ") VALUES (" . $var . ")";
// Prepare SQL insert
// $this->conn = new mysqli($this->server, $this->user, $this->pass, $this->name);
if(! ($stmt = $this->conn->prepare($sql))) {
return "Preparing failed!: (" . $this->conn->errno . ") " . $this->conn->error;
}
// Bind parameters. THIS IS WHERE THE ISSUE IS!
if(! $stmt->bind_param($type, $values)) {
return "Binding failed! (" . $stmt->errno . ") " . $stmt->error;;
}
// Execute the statement
if(! $stmt->execute()){
return "Executing failed! (" . $stmt->errno . ") " . $stmt->error;;
}
}
問題はパラメータをバインドすることです。値とキーを持つ複数の変数があるので、私はそれらを束縛する良い方法を見つけることができません。bind_param
にはそれぞれ新しい変数が必要です
つまり、私のSQLに不特定の長さの配列を追加する方法を探しています(安全な方法で)。
参考までに、このコードはSQLインジェクションに対して脆弱です。 –
ありがとう、私はまだそれを調べなければなりません。私はまだそれに多くの時間をかけていないので、それを認識しています。それはおそらく書いている間にそれを行う方が良いですが、私はまだそれに取り組んでいました。しかし頭をありがとう! –