2016-11-07 35 views
-1

我正在努力解決以下問題。幾年前,我寫了一個函數來檢索MYSQL結果(多行)。直到PHP7,此代碼工作正常:在PHP 7中獲取mysql結果的函數

function MultipleRows($query) 
{ 
    global $dbhost, $dbname, $dbuser, $dbpass; 
    mysql_connect($dbhost, $dbuser, $dbpass) 
     or die("Error! Couldn't <b>Connect</b>."); 

    mysql_select_db($dbname) 
     or die("Error! Couldn't <b>Select database</b>."); 

    $result = mysql_query($query) 
     or die("Error! Couldn't execute query."); 

    if(($result)&&(mysql_num_rows($result)>0)) 
    { 
     return $result; 
    } else { 
     return false; 
    } 
    mysql_close(); 
} 

現在在PHP7中,此代碼似乎不再工作。很多搜索後,我來到了這個作爲替代,但遺憾的是它不工作:

function MultipleRows($query) 
{ 
    $mysqli = new mysqli($dbhost, $dbpass, $dbuser, $dbname); 

    $result = mysqli_fetch_all($mysqli->query($query), MYSQLI_ASSOC); 
    return $result; 
    $mysqli->close(); 
} 

功能是指具有代碼工作是這樣的:

$res_test = MultipleRows("SELECT id, name FROM table"); 

if($res_test) 
{ 
    while($res = mysql_fetch_array($res_test)) 
    { 
     echo $res['id'].' '.$res['name']; 
    } 
} 

這不是一個好選項來重寫「顯示代碼」(最後一個片段),因爲在這種情況下,我必須在我的網站上重寫很多行。誰能給我一些幫助?提前致謝!

回答

1

mysql在PHP 5.x中棄用後,擴展已從PHP 7中刪除。

你可以使用mysqli如下重寫功能MultipleRows()

function MultipleRows($query) 
{ 
    global $dbhost, $dbpass, $dbuser, $dbname; 
    $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
    $result = $mysqli->query($query); 
    if ($result !== FALSE) 
     $result = $result->fetch_all(MYSQLI_ASSOC); 
    $mysqli->close(); 
    return $result; 
} 

一個幾句話:

  • 它不是使用全局變量($dbhost$dbuser$dbpass$dbname)是個好主意
  • 這種處理數據庫查詢的方式使您容易受到SQL注入攻擊
+0

感謝您的幫助!你的函數返回我想要的值,但不幸的是不是我希望的方式。我只能用foreach循環而不是while循環來顯示它們。有沒有辦法改變它?爲什麼它是一個脆弱的方式? –

+0

呃,我錯過了你的問題的最後一行 - 你只是不能在PHP 7中使用mysql_fetch_array'。想到兩種解決方案:1)重寫代碼使用'foreach'而不是'while ... mysql_fetch_array' ; 2)編寫一個庫,爲你提供'mysql_ *'函數(它必須在內部使用'PDO'或'mysqli')。 –

+0

關於SQL注入攻擊的漏洞 - 當使用函數'MultipleRows'時,你無法利用[prepared語句]提供的安全性(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)或'mysqli_real_escape_string()' –

0

每次查詢時都不要連接!每個頁面請求只能連接一次。