Это далеко не идеальный вариант, но я пытаюсь создать функцию для вставки данных в таблицу SQL с использованием MySQLI. Я хочу создать общую функцию, чтобы вставлять различные типы данных в разные базы данных. У меня есть следующее:Вставить массив неопределенной длины в 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
требует новой переменной для каждого
Короче говоря, m ищет способ добавить массив неуказанной длины в мой SQL (безопасным способом, конечно).
FYI, этот код уязвим для SQL-инъекции. –
Спасибо, я все еще должен заглянуть в это. Я знаю об этом, хотя я еще не уделял этому времени. Вероятно, лучше это делать во время написания, но я все еще работаю над этим. Спасибо за головы, хотя! –