php - 在php中向数组值添加引号

标签 php mysql

以下脚本用于从多维数组中内爆值并将其插入到 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)攻击的方式。

XKCD - Exploits of a mom

而是使用 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/

相关文章:

php - slug 的伪哈希索引

php - 使用 php 更新现有的 mysql 记录

php - 即使在 chmod 777 之后,require_once() 权限也被拒绝

javascript - Wordpress 中的内联 Javascript

php - 如何将 UNION ALL 查询的结果显示为链接?

c# - 防止一种形式在传递某些数据时打开两次

python - 操作错误(2003、 "Can' t 连接到 '127.3.138.130' (111) 上的 MySQL 服务器")

php - 如何在一个表中获取多语言数据(codeigniter,Mysql,Php)

mysql - 使用 GROUP_CONCAT

PHP/MySQL游戏服务器