2013-08-01 82 views
0

我正在轉換這對PDO此功能轉換爲PDO

function SystemConfig($str) 
     { 
      $tmp = mysql_query("SELECT ".$str." FROM server_status LIMIT 1") or die(mysql_error()); 
      $tmp = mysql_fetch_assoc($tmp); 
      return $tmp[$str]; 
     } 

我嘗試這樣做:

function SystemConfig($str) 
{ 
global $bdd; 
      $tmp = $bdd->prepare("SELECT ? FROM server_status LIMIT 1"); 
      $tmp->bindValue(1, $str, PDO::PARAM_INT); 
      $tmp->execute(); 
      $tmp_res = $tmp->fetch(PDO::FETCH_ASSOC); 
      return $tmp_res[$str]; 
     } 
     ?> 

但它的回報「users_online」,而不是值(10000數據庫)(PS:SystemConfig('users_online');)

有人可以幫助我嗎? Sincerly,

+0

多少列在這個表? –

+2

刪除你的問題身體不是要走的路。只是因爲「如果有人需要它」,他們就不會遇到這個問題。 –

+0

好的感謝您的重新編輯,對不起。 – DeerRobotSpy

回答

0
function SystemConfig($str) 
{ 
    static $row; 
    global $bdd; 

    if (!$row) 
    { 
     $stm = $bdd->query("SELECT * FROM server_status"); 
     $row = $stm->fetch(); 
    } 
    return $row[$str]; 
} 

,但更好的重新組織你的表,因爲唯一的行表是無稽之談

function SystemConfig($str) 
{ 
    global $bdd; 
    $stm = $bdd->prepare("SELECT value FROM server_status WHERE param = ?"); 
    $stm->execute(array($str)) 
    return $stm->fetchColumn(); 
} 
+1

真的,你想選擇所有的列只是爲了檢索一個值?如果您的網絡速度較慢,並且您的數據庫服務器和您的PHP服務器不在同一臺計算機上,這樣做效果不佳。 – knittl

+0

這就是爲什麼提出另一種解決方案。 –

+0

但這是一個完全不同的表結構。隨你。 – knittl

0

您只能將值參數與PDO綁定。你不能綁定列名,表名或其他東西。

您仍然必須通過連接字符串手動構建此查詢。爲了讓破解者的生活更難使用白名單方法:

if(!in_array($str, array('users_online', 'users_offline', 'free_memory')) die('...') 
// rest of the function. 

(但請停止使用過時的mysql_ *功能升級而不是庫MySQLi或者使用PDO,但沒有參數綁定爲這一個單一的查詢。)

+0

你在這個問題中的示例代碼使用mysql_ * – knittl