2016-11-07 10 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では、このコードはもう動作していないようです。それはよくないです

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

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

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

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

関数は次のようなコードで動作するように意図されています。検索の多くの後、私はこの代替として残念ながら、それは動作しません思い付きましたオプションを使用すると、 '表示コード'(最後のフラグメント)を書き換えることができます。その場合、私は自分のウェブサイトで多くの行を書き直さなければならないからです。誰が私にこれに何か助けを与えることができますか?前もって感謝します!

答えて

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-loopで表示することしかできず、while-loopで表示することはできません。それを変える方法はありますか?それはなぜ脆弱なのですか? –

+0

質問の最後の行を拝見しませんでした。PHP 7でmysql_fetch_arrayを使うことはできません。2つの解決策が考えられます。1) 'while ... 'の代わりに' foreach'を使うようにコードを書き換えます。mysql_fetch_array' ; 2) 'mysql_ *'関数を提供するライブラリを書きます( 'PDO'または' mysqli'を内部で使用する必要があります)。 –

+0

そして、SQLインジェクション攻撃に対する脆弱性に関しては、 'MultipleRows'関数を使用する場合、[prepared statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)によって提供されるセキュリティを活用することはできません。 "mysqli_real_escape_string()" –

0

クエリを実行するたびに接続しないでください。すべてのページリクエストで一度だけ接続する必要があります。

関連する問題