好的,这就是问题所在:
我正在尝试为我的项目中的数据库类编写查询函数,我想让它更容易逃脱sql并检查它是否对数据库有害。
假设我有这样的查询:
INSERT INTO users (id,name,email,username,birthdate)
VALUES(1,'Josh','josh101@coolsite.com','josh101','1978-11-02')
但如果我将其硬编码到函数中,它将无法提供帮助。所以假设我为所有要插入的值使用了问号,然后将数组传递给包含我想要替换的实际值的函数,就像在codeigniter中完成的那样。
以下是一个示例:
//Here's the way the function appears in the class definition.
public function query($sql,$params=array()){
if (!empty($params) && is_string($sql)):
//do some stuff here.
elseif (empty($params) && is_string($sql)):
//do some other stuff here.
else:
//bad sql argument.
die("Mysql_database ERROR: The query submitted is not a string!");
endif;
}
//Here's where the function is applied.
$sql="INSERT INTO users (id,name,email,username,birthdate)
VALUES(?,?,?,?,?)";
$params=array(1,'Josh','josh101@coolsite.com','josh101','1978-11-02');
$db= new Mysql_database();
$response=$db->query($sql,$params);
现在这就是我想要做的事情:
问题是似乎所有问号都只被数组的第一个元素所取代:
以下是代码:
/*assuming I already have a function called create_array that well,
basically creates an array with n elements
specified in the first parameter and fills each element with the value provided in
the second parameter.*/
$toreplace = create_array(substr_count($sql, "?"),"?");
$sqlComplete = str_replace($toreplace, $params, $sql);
如果我回显$ sqlComplete,我得到这个:
INSERT INTO users (id,name,email,username,birthdate)
VALUES(1,1,1,1,1)
我能做些什么让$ params的每个元素都放在sql字符串中的适当位置?
PS:请不要告诉我只使用codeigniter,因为我试图通过从头开始构建项目来挑战自己,我不想总是依赖框架来完成工作。< / p>答案 0 :(得分:2)
答案 1 :(得分:1)
可以这样做:
$params=array(1,'Josh','josh101@coolsite.com','josh101','1978-11-02');
$sql="INSERT INTO users (id,name,email,username,birthdate)
VALUES(?,?,?,?,?)";
foreach($params as $param)
{
$pos = strpos($sql, '?');
if($pos !== false)
{
$sql = substr_replace($sql,"'" . $param . "'",$pos,1);
}
}
echo $sql;
<强>输出强>
INSERT INTO users (id,name,email,username,birthdate) VALUES('1','Josh','josh101@coolsite.com','josh101','1978-11-02')
这不会进行任何转义,它只会填充查询中的值。您需要添加适用于框架/数据库API的转义。