2011-09-06 69 views
0

我有一個PHP函數2輸出如下PHP數組取代

首頁輸出給了我這樣的

INSERT INTO "table1" ('column1', 'column2', 'column3') VALUES (?,?,?) 
INSERT INTO "table2" ('column1', 'column2', 'column3','column4','column5') VALUES (?,?,?,?,?) 

其他輸出一些東西給

Array = (
1 => 'value1', 
2 => 'value2', 
3 => 'value3', 
) 

Array = (
1 => 'value1', 
2 => 'value2', 
3 => 'value3', 
4 => 'value4', 
5 => 'value5', 
) 

,現在我想請執行以下操作.. 如何更換「?」在值爲value1,value2和value3的第一個INSERT QUERY中,第二個查詢中的值與第二個數組中的值相同。

問候

+4

參考子指數這似乎喜歡的事,自動通過類似[PDO](http://php.net/PDO)的方式完成。 –

+0

如果這是一個選項,您應該使用PDO。 – Quasdunk

回答

1

通用的解決方案:

function replaceWithArray($query, $array) { 
    $n = 0; 
    return preg_replace('~\?~e', '$array[$n++]', $query); 
} 

example on Codepad

注意:如果要更換?只介乎括號,使用這樣的回顧後:preg_replace('~\?(?=[^\(\)]*\))~e', '$array[$n++]', $query);

+0

謝謝,這一個應該工作...但不知道我做錯了什麼,每個?通過信件接受..i.e。 v,a,l,u,e .... 1,v,a,l ... – geej

+0

看看我在[codepad]上的示例(http://codepad.org/OxgC18Ms)。你的數組必須是這樣的:'array('value1','value2',...)'。就像你的問題一樣。你在'print_r'你的數組時有什麼? –

+0

我的數組如下所示..但我使用foreach來單獨獲取值並將它變爲一個變量..然後我有另一個SQL語句?在一個變量中..現在當我嘗試你給的東西時,每個問題都需要逐字逐句,而不是整個值。我有一個函數,讓這兩個輸出(數組和SQL ..),並在那我想替換每個?與價值...例如,我得到4陣列作爲輸出,我有4匹配的SQL,所以每件事情應該?應該用價值代替。如果我第一次不清楚的話。 陣列=( 1 => 'VALUE1', 2 => '值2',3 => '值3', ) – geej

0
$foo = implode("','",$array); 
INSERT INTO "table1" ('column1', 'column2', 'column3') VALUES ('$foo') 
1

這確切sollution可以做這樣的:

$query1 = "INSERT INTO `table1` (`column1`, `column2`, `column3`) VALUES (?,?,?)"; 
$query2 = "INSERT INTO `table2` (`column1`, `column2`, `column3`,`column4`,`column5`) VALUES (?,?,?,?,?)"; 

$values1 = array("value1","value2","value3"); 
$values2 = array("value1","value2","value3","value4","value5"); 


function insertIntoQuery($query, $values){ 
    $countval = count($values); 
    $replace = array(); 
    for($i=0; $i<$countval; $i++){ 
     $replace[] = '?'; 
    } 
    $implode = implode(",", $replace); 
    $values = implode("','", $values); 
    $query = str_replace($implode, "'".$values."'", $query); 
    return $query; 
} 

echo insertIntoQuery($query1, $values1); 
echo "<br />"; 
echo insertIntoQuery($query2, $values2); 
2
echo $query1 =str_replace("?,?,?","'".implode("','",$values1)."'",$query1); 
echo $query2 =str_replace("?,?,?","'".implode("','",$values2)."'",$query2); 
1

如果您使用的是,???在select語句中,它是元語法的,MySQL將在運行時用實際值替換這些變量。如果你的格式是可變的,這可能是危險的,但如果你使用的是靜態數據,MySQL的第一個猜測將始終是正確的,如果它正確對齊開始。

根據Php 5.x手冊有一個函數調用這個array_replace,奇怪的是看起來很像你的例子。我運行PHP 5.2和服務器始終只是拒絕在該函數調用就像這樣:

致命錯誤:調用未定義功能array_replace()

但CLI和mod_php的是後5.2xx

[root @ networktag dom]#php -i | grep的-i版本 PHP版本=> 5.2.10

現在同時在http://php.net/manual/en/function.array-replace.php的例子說,以取代陣列這樣,直到誰創建的編程語言解釋趕上誰寫它似乎並沒有手動在安裝了CentOS數據中心的Linux機器上運行CentOS 5.2,使用PhP rpmforge升級到5.2。這真的是自PHP 5.x的+支持陣列解引用,像這樣一個模擬點:

$array_1 = array('Tom','Dick','Harry'); 
$array_1[1] = "Car 54"; 
print_r($array_1); 

輸出: 陣列 ( [0] =>湯姆 [1] =>車54 [2 ] => Harry )

如果您需要更精細的控制權來取消引用或替換數組值,則不要依賴主數組中的默認索引。創建一個增量計數器,然後使用它轉換數組索引,例如$ array [$ i] = array(「Foo」=>「Bar」,「Bar」=>「Foo」); $ i是$ i ++。

...或...如果你使用的是PHP的一個較新的版本,你甚至可以從邏輯邊界外側

print_r($array[$i])(0); 

:)