我试图创建一个自定义MVC框架,其中我有一个函数,在数组和触发插入查询。
function insertFromArray($array, $table) {
foreach ($array as $key => $value) {
$fields[] = "`" . $key . "`";
$values[] = "'" . $value . "'";
}
$sql = "INSERT INTO `$table` (" . implode(",", $fields) . ") VALUES (" . implode(",", $values) . ")";
mysql_query($sql);
return (mysql_error()) ? mysql_error() : mysql_insert_id();
}
但是当我得到一些mysql函数而不是字符串或整数时,我的函数不起作用例如,对于文件名'dateTime',我得到value = NOW()在这种情况下,我的查询将是
INSERT INTO `$table` (`field1`, `field2`, `dateTime`) VALUES ('value1','value2','NOW()')
这将抛出错误,我想要一些通用的解决方案,这样我的查询将运行在任何情况下,如果它是一个字符串,数字或如果它是任何mysql函数。
我尝试创建一个所有函数的数组,并开始比较,如果$value的开始匹配mysql函数数组中的任何函数但我不认为这是一个好方法,有更好的方法吗
$values[] = "'" . $value . "'";
上面这行把所有的值都当作字符串,这就导致了这个问题。不要把所有的值都当作字符串并用单引号括起来。
你甚至可以让值部分本身成为一个包含两个元素的数组:一个用于值,另一个用于值的类型(字符串、数字、函数等),并且在创建插入语句时对它们进行不同的处理。
请使用mysql或PDO代替php的旧mysql扩展名。
可以使用数组来存储SQL关键字/函数名。然后在查询字符串中测试当前值是否为SQL单词。如果是,就不要引用,否则,你就引用。
下面是一个例子:
function is_sql_term($term)
{
$sql_terms = array('NOW()', 'DATE()', ...);
return in_array($term, $sql_terms) || preg_match("/'(.*')/", $term);
}
然后按如下方式测试:
$values[] = is_sql_term($value) ? $value : "'" . $value . "'";