2011-03-09 180 views
3

在這裏搜索和谷歌超過一個小時,似乎無法找到答案。php - 將單引號字符串轉換爲雙引號

我有一個從包含變量的數據庫查詢返回的字符串,但它看起來這些字符串都返回單引號,因此變量不被評估,因爲它們是如果它是雙引號。

什麼是從SQL查詢返回的將是$結果:

這不會評估兩個變量:

$myname = 'david'; 
$occupation = 'Beginner'; 
$result = 'Hello my name is $myname and I my occupation is $occupation'; 
echo $result; 

這將評估2個變量:

$myname = 'david'; 
$occupation = 'Beginner'; 
$result = "Hello my name is $myname and I my occupation is $occupation"; 
echo $result; 

我的問題是如何將單引號字符串轉換爲能夠評估變量的雙引號字符串?

感謝

回答

1

你可以做這樣的事情:

<?php 
$myname = 'david'; 
$occupation = 'Beginner'; 
eval("\$result = 'Hello my name is $myname and I my occupation is $occupation';"); 
echo $result; 
?> 

但是,我堅決不推薦評估從數據庫中的任何代碼。任何超出您的控制範圍的都是安全風險。

+4

唉,不使用eval,**特別是* *用於來自數據庫的字符串。除非你有嚴格的控制或完美的清理琴絃,否則這可能是一個可怕的安全漏洞。 – 2011-03-09 05:45:04

+1

正如我在下面所說的代碼片段;)更換方法會更適合,因爲你張貼,但我真正回答了這個問題。有一個upvote – 2011-03-09 05:46:33

+0

哈哈,我的壞。我看到了'eval',我的視線變得模糊起來。 :D – 2011-03-09 05:49:09

6

PHP現在沒有一個標準的安全方法來做到這一點。已經有好幾年要求它開放的功能要求:http://bugs.php.net/bug.php?id=43901

一個機票上的意見提供了一個正則表達式做簡單$foo${foo}替代:

function stringExpand($subject, array $vars) { 
    foreach ($vars as $name => $value) { 
    $subject = preg_replace(sprintf('/\$\{?%s\}?/', $name), $value, $subject); 
    } 
    return $subject; 
} 
+0

+1,用於指向功能請求的鏈接 – chim 2014-03-14 11:21:39

2

如果你知道的名字要更換你能做到這一點變量...

$myname = 'david'; 
$occupation = 'Beginner'; 
$result = 'Hello my name is $myname and I my occupation is $occupation'; 

$result = str_replace( 
       array('$myname', '$occupation'), 
       array($myname, $occupation), 
       $result); 

,這將是比內森的stringExpand功能更快,但如果你不知道的變量名,那麼就使用Nathan的方法。

我試圖解決的時候,我發現這個問題是在一個CSV飼料換行符做,解決了這樣的問題:

// string from drupals csv feed tamper settings 
$string = '22 Acacia Avenue\n Irlam\n Manchester'; 
$string = str_replace('\n', "\n", $string); 
print nl2br($string); // demonstrates that the \n's are now linebreak characters 
相關問題