Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中使用str_replace进行多次替换_Php_Codeigniter_Str Replace - Fatal编程技术网

在php中使用str_replace进行多次替换

在php中使用str_replace进行多次替换,php,codeigniter,str-replace,Php,Codeigniter,Str Replace,好的,问题是: 我正试图在我的项目中为一个数据库类编写查询函数,我想让它更容易地转义sql并检查它是否对数据库有害 假设我有这样一个问题: INSERT INTO users (id,name,email,username,birthdate) VALUES(1,'Josh','josh101@coolsite.com','josh101','1978-11-02') $params=array(1,'Josh','josh101@coolsite.com','josh101','1978-1

好的,问题是:

我正试图在我的项目中为一个数据库类编写查询函数,我想让它更容易地转义sql并检查它是否对数据库有害

假设我有这样一个问题:

INSERT INTO users (id,name,email,username,birthdate)
VALUES(1,'Josh','josh101@coolsite.com','josh101','1978-11-02')
$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;
但是,如果我将其硬编码到函数中,它将不会真的有帮助。假设我对所有要插入的值都使用问号,然后将一个数组传递给包含我要替换的实际值的函数,就像在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);
现在我想做的是:

  • 如果没有提供第二个参数,只需按原样运行查询
  • 否则,请检查为其类型提供的数组元素并正确转义它们,然后在提供的伪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,因为我试图通过从头开始构建一个项目来挑战自己,我不想总是依赖框架来完成工作。

    也许只使用?

    也许只使用?

    可以这样做:

    INSERT INTO users (id,name,email,username,birthdate)
    VALUES(1,'Josh','josh101@coolsite.com','josh101','1978-11-02')
    
    $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')
    

    这不会进行任何转义,它只是填充查询中的值。您需要添加适合框架/DB API的转义。

    可以这样做:

    INSERT INTO users (id,name,email,username,birthdate)
    VALUES(1,'Josh','josh101@coolsite.com','josh101','1978-11-02')
    
    $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')
    

    这不会进行任何转义,它只是填充查询中的值。您需要添加适用于框架/DB API的转义。

    谢谢,我对准备好的语句一无所知,我想知道如何使用它们会有很大帮助,所以我一定会读到。:)谢谢,我对准备好的语句一无所知,我想知道如何使用它们会有很大帮助,所以我一定会读到。:)