sql >> データベース >  >> RDS >> Mysql

mysql_関数を使用してスクリプトをmysqli_関数を使用するように変換するにはどうすればよいですか?

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

    mysql_のすべてのインスタンスを置き換えようとするのは魅力的かもしれません。 mysqli_を使用 そしてそれがうまくいくことを祈ります。あなたは近くにいるでしょうが、完全には正しいとは言えません。

    データベースへの接続:

    幸い、 mysqli_connect mysql_queryに十分に密接に機能します それらの関数名を入れ替えることができます。

    mysql _:

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

    mysqli _:

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

    データベースの選択

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

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

    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);
    

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

    mysql_の理由の1つ 関数は、準備されたステートメントを処理できないため、そもそも非推奨になりました。コードをmysqli_に変換するだけの場合 この重要なステップを踏まないと、mysql_の最大の弱点のいくつかにさらされます。 関数。

    プリペアドステートメントとその利点に関するこれらの記事を読む価値があります:

    Wikipedia-プリペアドステートメント

    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);
        }
    }
    


    1. 統計がロックされているテーブルを見つける方法

    2. データを並べ替えないようにするにはどうすればよいですか?

    3. postgreSQLで変数を使用してリターンタイプを指定しないことは可能ですか?

    4. Hibernate_sequenceテーブルが生成されます