7

編集:使用するかどうかはmysqli_、この質問の範囲外です。PDO の使用を検討してください。


mysql_非推奨の関数を使用するスクリプトを に変換するには、どのような手順を実行する必要がありますmysqli_か?

mysqli_の代わりに使用する場合、別の方法で行う必要があることはありmysqlますか?

mysql_関数を使用した基本的なスクリプトを次に示します。

<?php

//define host, username and password

$con = mysql_connect($host,$username,$password);
if (!$con) {
    die('Could not connect: ' . mysql_error());
}

$db_name ="db1";
mysql_select_db($dbname, $con);

$value1 = mysql_real_escape_string($input_string);

$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);

while($row = mysql_fetch_assoc*$result)
{
    $col1 = $row['col1'];
    $col2 = $row['col2'];

    echo $col1 . ' ' . $col2 . '<br />';
}

mysql_close($con);
?>
4

3 に答える 3

17

注:mysql_からへの変換はmysqli_最適ではない場合があります。すべてのコードをOOPに変換する準備ができている場合は、PDOを検討してください。

mysql_のすべてのインスタンスをwithに置き換えてmysqli_、それが機能することを祈りたくなるかもしれません。あなたは近くにいますが、まったく的を射ていません。

データベースへの接続:

幸いなことに、関数名を交換するだけでmysqli_connect十分に機能します。mysql_query

mysql_:

$con = mysql_connect($host, $username, $password);

mysqli_:

$con = mysqli_connect($host, $username, $password);

データベースの選択

ライブラリ内の他のほとんどの関数では、データベース接続を最初のパラメーターとしてmysqli_渡す必要があります。ほとんどの関数では、最初に接続オブジェクトが必要です。mysqli_select_dbmysqli_

この関数では、関数に渡す引数の順序を入れ替えるだけです。以前に接続オブジェクトを渡していなかった場合は、最初のパラメーターとして追加する必要があります。

mysql_:

mysql_select_db($dbname, $con);

mysqli_:

mysqli_select_db($con, $dbname);

おまけとして、データベース名を 4 番目のパラメーターとして渡すこともできます。これmysqli_connectにより、呼び出す必要がなくなりますmysqli_select_db

$con = mysqli_connect($host, $username, $password, $dbname);

ユーザー入力のサニタイズ

使い方mysqli_real_escape_stringは とよく似ていmysql_real_escape_stringます。接続オブジェクトを最初のパラメーターとして渡すだけです。

mysql_:

$value1 = mysql_real_escape_string($input_string);

mysqli_:

$value1 = mysqli_real_escape_string($con, $input_string);

非常に重要: クエリの準備と実行

関数が最初から廃止された理由の 1 つmysql_は、準備済みステートメントを処理できないことでした。この重要な手順を実行せずに単にコードを に変換するmysqli_と、関数の最大の弱点のいくつかにさらされることになりmysql_ます。

準備されたステートメントとその利点に関する次の記事を読む価値があります。

ウィキペディア - 準備された声明

PHP.net - MySQLi プリペアド ステートメント

*注: 準備済みステートメントを使用する場合は、表記法を使用してすべての列を照会するのではなく、照会しようとしている各列を明示的にリストすることをお勧めします。このようにして、 への呼び出しですべての列を考慮したことを確認できますmysqli_stmt_bind_result

mysql_:

$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);
while($row = mysql_fetch_assoc*$result)
{
    $col1 = $row['col1'];
    $col2 = $row['col2'];

    echo $col1 . ' ' . $col2 . '<br />';
}

mysqli_:

$query = 'SELECT col1,col2 FROM table1 WHERE table1.col1=?';
if ($stmt = mysqli_prepare($link, $query)) {

    /* pass parameters to query */
    mysqli_stmt_bind_param($stmt, "s", $value1);

    /* run the query on the database */
    mysqli_stmt_execute($stmt);

    /* assign variable for each column to store results in */
    mysqli_stmt_bind_result($stmt, $col1, $col2);

    /* fetch values */
    while (mysqli_stmt_fetch($stmt)) {
        /*
            on each fetch, the values for each column 
            in the results are automatically stored in 
            the variables we assigned using 
            "mysqli_stmt_bind_result"
        */
        echo $col1 . ' ' . $col2 . '<br />';
    }

    /* close statement */
    mysqli_stmt_close($stmt);
}

エラーの表示

エラーの表示は、 では少し異なりmysqli_ます。mysqli_error最初のパラメーターとして接続オブジェクトが必要です。しかし、接続が失敗した場合はどうなりますか? mysqli_接続オブジェクトを必要としない関数の小さなセット、関数を導入しmysqli_connect_*ます。

mysql_:

if (!$con) {
    die('Could not connect: ' . mysql_error());
}

if (!$result) {
    die('SQL Error: ' . mysql_error());
}

mysqli_:

/* check connection error*/
if (mysqli_connect_errno()) {
    die( 'Could not connect: ' . mysqli_connect_error() );
}

/* check query error */
if ($stmt = mysqli_prepare($link, $query)) {

    // ... execute query

    if (mysqli_stmt_error($stmt)) {
        echo 'SQL Error: ' . mysqli_stmt_error($stmt);
    }
}
于 2013-02-24T20:00:16.497 に答える
1

例。

これはあなたのdbcクラスです

<?php

class dbc {

    public $dbserver = 'server';
    public $dbusername = 'user';
    public $dbpassword = 'pass';
    public $dbname = 'db';

    function openDb() {    
        try {
            $db = new PDO('mysql:host=' . $this->dbserver . ';dbname=' . $this->dbname . ';charset=utf8', '' . $this->dbusername . '', '' . $this->dbpassword . '');
        } catch (PDOException $e) {
            die("error, please try again");
        }        
        return $db;
    }

    function getAllData($qty) {
        //prepared query to prevent SQL injections
        $query = "select * from TABLE where qty = ?";
        $stmt = $this->openDb()->prepare($query);
        $stmt->bindValue(1, $qty, PDO::PARAM_INT);
        $stmt->execute();
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $rows;
    }    
?>

あなたのPHPページ:

<?php 
require "dbc.php";

$getList = $db->getAllData(25);

foreach ($getList as $key=> $row) {
         echo $row['columnName'] .' key: '. $key;
    }
于 2013-02-24T20:39:51.800 に答える
0

mysql_ 関数を mysqli_ に変換しないでください。限目。

そうする理由は一つではありません。

まず、アルゴリズムを同じままにして関数名のみを変更して、機械的にこれを行う理由はありません。

パラメータ化されたクエリを実装しないと、このような動きはほとんど意味がありません。
あなたの唯一の懸念が「推奨されない」エラーである場合 - あなたは単にそれらをオフにすることができます

error_reporting(E_ALL & ~E_DEPRECATED);

古い mysql_* を引き続き楽しく使用し
てください。これが必要になるのは、PHP 5.5 が共有ホスティングに到達する 2 ~ 3 年後になることに注意してください。
ですから、急ぐ必要もありません。

次に、本当に必要なのは、コードからすべての生の API 呼び出しを削除することです。

それらをある種の抽象化ライブラリにカプセル化します。これはあなたの主な関心事であり、このライブラリで使用されている特定の API ではなく、ウィンクで変更される可能性があります。

mysql_*最後に、 からに切り替える唯一の本当の理由mysqli_*は、パラメーター化されたクエリです。

そしてmysqliはそれらとはまったく使えません。

準備済みステートメントでは、PDO が唯一の選択肢です。

私の言いたいことをお見せしましょう。
クエリに動的に追加する HTML フォームからのチェックボックスの配列があるとします。
PDO を使用すると、比較的健全で非常に簡潔な (ただし、それでも役に立たないほど複雑で汚染された) コードを作成できます。

$in  = str_repeat('?,', count($_GET['cat']) - 1) . '?';
$sql = "SELECT * FROM table WHERE category IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($_GET['cat']);
$data = $stm->fetchAll();

mysqli を使用すると、このような些細なケースでも、数ページにわたる非常に複雑なコードを作成してデバッグするのに何時間もかかります。

試してみてください。

ただし、PDO でさえ、特定のクエリ部分を作成するために、あいまいで役に立たないコードが必要です。したがって、最善の方法は、safemysqlなどのよりインテリジェントなライブラリを使用することです。これは、バインドからフェッチまですべてのジョブを内部で実行し、すべてのコードを 1 行にします

$data = $db->getALL("SELECT * FROM table WHERE category IN (?a)", $_GET['cat']);
于 2013-02-24T20:04:24.463 に答える