以下脚本用于从多维数组中内爆值并将其插入到 mysql 表中。该表包含varchar和decimal两种字段数据类型。由于 varchar 类型需要引号并避免有选择地放置引号,因此我想将所有值都放在引号中。如何实现?
$values = array();
foreach ($data as $rowValues) {
foreach ($rowValues as $key => $rowValue) {
}
$values[] = "(" . implode(', ', $rowValues) . ",'".$date."')";
}
$query = "INSERT INTO mem (memno,loan,subsc,intst, date)
VALUES " . implode (', ', $values);
$result=mysql_query($query) or die();
我想要这样的sql
INSERT INTO mem (memno,loan,subsc,intst, date)
values('value1', 'value2', 'valu3','value4','value5')
最佳答案
不要使用用户输入来构建 SQL 字符串 - 这就是 SQL 注入(inject)攻击的方式。
而是使用 a prepared statement :
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
$stmt = $mysqli->prepare("
INSERT INTO mem( memno, loan, subsc, intst, date )
VALUES (?, ?, ?, ?, ?);
");
$stmt->bind_param('sssss', $memno, $loan, $subsc, intst, $date);
编辑回应评论:
使用 PDO 动态绑定(bind)列数组非常容易。
$db =new PDO("mysql:host=localhost;dbname=database;","root","");
/**
* @param PDO $db
* @param string $table - the table to insert into
* @param array $columns - which columns do we want to insert into
* @param array $data - a key/value array of the data we want to insert
* @return bool
*/
function insert_into($db, $table, array $columns, array $data) {
$rows = implode(', ', $fields);
$placeholders = array_map ( function($key){ return ":$key" }, $fields);
$placeholders = implode(', ', $fields);
$sql = "
INSERT INTO $table ($fields)
VALUES ($placeholders);
";
$stmt = $db->prepare($sql);
foreach( $fields as $field) {
$stmt->bindParam(":$field", $data[$field]);
}
return $sth->execute();
}
$inserted = insertInto(
$db
'mem',
array("memno", "loan", "subsc", "intst", "date"),
$data
);
请注意,要插入的列是单独定义的。 如果我使用过:
array_keys($data);
这将导致 mass assigment vulnerability如果 $data
来自用户输入且未列入白名单。
您可以使用 mysqli
完成同样的事情,但它有点棘手。
关于php - 在php中向数组值添加引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28957103/