0

好的,问题来了:

我正在尝试为我的项目中的数据库类编写查询函数,我想让它更容易转义 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);

现在这就是我想要做的:

  1. 如果未提供第二个参数,则按原样运行查询。
  2. 否则检查为其类型提供的数组元素并正确转义它们,然后在提供的伪 sql 字符串中的适当位置替换它们。

问题是似乎所有的问号都被数组的第一个元素替换了:

这是代码:

/*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,因为我想通过从头开始构建一个项目来挑战自己,我不想总是依赖框架来完成工作。

4

2 回答 2

2

也许只使用MySQL 准备好的语句

于 2012-11-27T09:24:11.603 回答
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 的转义。

于 2012-11-27T09:25:35.920 回答