我正在尝试使用以下内容保存一些代码。我有一个对象,其变量名称与表行相同,因此我可以像这样创建一个插入:
$query = "INSERT INTO table ";
$columns = '(';
$values = 'VALUES (';
foreach ($this as $var => $value){
if ($value){
$columns .= $var.', ';
if (!is_int($value))
$value = '\''.$value.'\'';
$values .= $value.', ';
}
}
$columns .= ')';
$values .= ')';
$columns = str_replace (', )', ')', $columns);
$values = str_replace (', )', ')', $values);
$query .= $columns." ".$values;
但是每个变量都被检测为字符串,并且在您想象的所有字段中都不是这样。
有没有人有解决方案?
答案 0 :(得分:3)
以下是我的写作方式:
<?php
$canonical_columns = array_flip(array("column1", "column2", "column3"));
$columns = array_keys(array_intersect_key($canonical_columns, (array) $this));
$params = join(",", array_fill(0, count($columns), "?"));
$columns = join(",", $columns);
$query = "INSERT INTO table ($columns) VALUES ($params)";
$stmt = $pdo->prepare($query);
$stmt->execute(array_values($this));
停止连接字符串片段以形成SQL。
使用PDO,并使用参数作为值。
通过将输入与已知的有效列名进行比较,将列列名列入白名单。
答案 1 :(得分:0)
看起来好像你的数字实际上是字符串。尝试使用is_numeric()而不是is_int()。 如果这还不够,可以将字符串转换为整数,然后检查!= 0。
答案 2 :(得分:0)
您也可以在引号中插入数字,作为字符串。这不会产生错误。