使用php检查字段的值是否为mysql函数


Using php check if the value of a field is a mysql function or not

我试图创建一个自定义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 . "'";