The following code should insert each key-value pair in an array into a mathing column-value in a table. The script returns no errors but the the inserted row contains only
$conn = new PDO('mysql:host=' . $HOST . ';dbname=' . $DATABASE, $USERNAME, $PASSWORD);
$conn->exec("set names utf8");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$ins_query = 'INSERT INTO `' . $table_name . '` ';
$columns = array();
$columns_bindings = array();
foreach ($dataArray as $column_name => $data) {
$columns[] = $column_name;
$columns_bindings[] = ':' . $column_name;
}
$ins_query = $ins_query . '(' . implode(', ', $columns) . ') VALUES (' . implode(', ', $columns_bindings) . ')';
$stmt = $conn->prepare($ins_query);
foreach ($dataArray as $column_name => $data) {
$stmt->bindValue(":" . $column_name, $data);
}
if (!$stmt->execute()) {
print_r($stmt->errorInfo());
} else {
echo "Insertd";
}
foreach($array as $key => $value){
$STH->bindParam(':' . $key,$array[$key]);
}
Try that
maybe something like this:
$columns = array('one'=>1,'two'=>2,'three'=>3);
$columnString = implode(',', array_flip($columns));
$valueString = ":".implode(',:', array_flip($columns));
$core = core::getInstance();
$STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES (" . $valueString . ")");
foreach($columns as $key => $value){
$STH->bindValue(':' . $key, $value);
}
Forget about bindParam
, just use execute
and pass it the values of $array
:
$STH->execute($array);
Alternatively, you could scratch the named parameters altogether to simplify your code a little:
$columnString = implode(',', array_keys($array));
$valueString = implode(',', array_fill(0, count($array), '?'));
$STH = $core->dbh->prepare("INSERT INTO table ({$columnString}) VALUES ({$valueString})");
$STH->execute(array_values($array));