您好我一直在尝试将数组插入MySql数据库
我遇到的问题是我有不同的数据类型,有时数据可以是0值,有()大括号,百分号值带%符号。我想知道一种方法可以使用一些已经构建的php函数来处理这个问题。
所以这就是我到目前为止所做的:
$t = array('country_code' => $data->country_code,
'Name' => $data->Name,
'money' => $data->money,
'chanceToDie' => $data->death,
'age' => $cb->age)
/* FORMAT EXAMPLE
country_code = Africa (AF)
name = jack
chanceToDie = 5.5
age = 62
*/
$columns = implode(", ",array_keys($t));
//Tried
$values = implode(", ",array_values($t)); //Dont work
$values = "'".implode("', '",array_values($t))."'"; //Dont work
$sql = "INSERT INTO table ($columns) VALUES ($values)";
答案 0 :(得分:1)
您需要引用每个单独的值并使用array_values()
代替array_keys()
:
$values = '"' . implode('", "', array_values($t)) . '"';
然而,这会给你留下一个sql注入问题,所以你应该使用一个预备语句。
在PDO中你可以使用类似的东西(假设你控制键并且它们可以安全使用):
$values = ':' . implode(', :', array_keys($t));
// generates: ... VALUES(:country_code, :Name, :money, // etc
现在,您可以使用数组准备和执行查询,以将值绑定到占位符。参见例如http://php.net/manual/en/pdo.prepared-statements.php(第6个例子)。
答案 1 :(得分:1)
尝试利用PDO准备的查询的优势 - 它更安全,更方便。
您的代码可能如下所示:
$col_names = array_keys($t);
// filter column names before inserting to sql to prevent sql injection
array_filter($col_names, function($v){return preg_relace("@\W@", "_", $v);});
// generate placeholders list: ?,?,?,?
$placeholders = implode(',', array_fill(0, count(t), "?"));
$values = array_values($t);
$q = $pdo->prepare('insert into (' . implode(",", $col_names) . ') values (' . $placeholders . ')');
$q->execute($values);
PDO将处理数据类型并使用相应的值正确替换每个占位符。