我正在创建一个自定义类,以使连接和使用 mysql 通常更容易。我已经创建了许多功能,除了一个部分之外,所有功能都可以正常工作。我似乎无法弄清楚如何确定一个字符串是一个实际的字符串还是一个 mysql 函数,以便在它周围加上引号。我整理了一个可以传递两个参数的函数,它将插入到数据库中。第一个参数是要插入的表,而第二个参数是列、值对的数组。也许这个代码示例将帮助您了解更多。注意:我已经转义了所有字符串并删除了该代码以显示问题的简单性。
function insert($table,array $array){
$table = "`".$table."`";
$columns = "";
$values = "";
foreach($array as $key => $value){
$columns = ($columns=="") ? "`".$key."`" : $columns.", `".$key."`";
if($value===NULL || $value=="NULL"){
$value = "NULL";
} else {
$value = "'".$value."'";
}
$values = ($values=="") ? "".$value."" : $values.", ".$value."";
}
$query = "INSERT INTO $table ($columns) VALUES ($values)";
return $this->query($query);
}
这是两个不同用途的示例以及预期结果或每个
$data = array(
"first_name"=>"John",
"last_name"=>"Doe",
"entry_date"=>"2013-08-26"
);
$MyClass->insert("people",$data);
会执行
INSERT INTO `people` (`first_name`,`last_name`,`entry_date`) VALUES ('John','Doe','2013-08-26')
这是预期的但是以下用途:
$data = array(
"first_name"=>"John",
"last_name"=>"Doe",
"entry_date"=>"NOW()"
);
$MyClass->insert("people",$data);
将执行为
INSERT INTO `people` (`first_name`,`last_name`,`entry_date`) VALUES ('John','Doe','NOW()')
这将不起作用,因为如果 MySQL 函数带有引号,则不会对其进行操作。我知道这可能是一个小的安全风险,因为如果没有被捕获,它将允许用户使用功能。有没有更好的方法来做到这一点,或者在这样的类插入函数中不允许使用 MySQL 函数?如果有人整理了一个正则表达式来查找并允许 mysql 函数,那么这可能是一个解决方案。如果不存在这样的正则表达式,那么一种可能性是从头开始编写一个我不太擅长的...
编辑:
同时我将使用的另一个解决方案是在形成数组时使用 PHP 获取日期。如果可能的话,我还是想使用 MySQL 函数。这是我当前的代码,它解决了这个问题,但不是我喜欢的:
$data = array(
"first_name"=>"John",
"last_name"=>"Doe",
"entry_date"=>date('Y-m-d H:i:s'),
);
$MyClass->insert("people",$data);