2012-11-27 28 views
0

OK這裏的問題:製作使用str_replace函數多個替換在PHP

我試圖寫在我的項目數據庫類的查詢功能,我想更容易逃脫SQL並檢查它是否反正對數據庫有害。

比方說,我有這樣的查詢:

INSERT INTO users (id,name,email,username,birthdate) 
VALUES(1,'Josh','[email protected]','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','[email protected]','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,因爲我試圖通過從頭開始構建項目來挑戰自己,我不想總是依賴框架來完成工作。

回答

1

這是可以做到這樣的:

$params=array(1,'Josh','[email protected]','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','[email protected]','josh101','1978-11-02') 

這並不做任何轉義,它只是填充在查詢中的值。您需要添加適合框架/數據庫API的轉義。

+0

謝謝!它實際上有效! – ninjacoder