1

以下のクエリは、データベースにユーザー名が既に存在していても、ユーザー名が既に存在していることを示していません。

パラメータなどをバインドする方法を学ぼうとしていますが、どこかで混乱していると思います。

<?php
    // Include config.php
    require_once("".$_SERVER['DOCUMENT_ROOT']."/admin/config.php");

    // top.inc.php
    require_once($top_inc);
?>

<!-- Meta start -->
<title></title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<!-- Meta end -->

<!-- CONTENT START -->

<?php
    // sidebar.inc.php
    require_once($sidebar_inc);

    // main.inc.php
    require_once($main_inc);

    // check if form has been submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])){

        // initialize form errors array
        $error    = array();

        // fetch form data
        $username = $_POST['username'];
        $email    = $_POST['email'];
        $password = $_POST['password'];

        // validate form data
        if(!preg_match(constant("USERNAME_REGEX"), $username)){
            $error[] = "Please enter a username. Use 3 to 15 digits and letters";
        }
        if(!preg_match(constant('PASSWORD_REGEX'), $password)){
            $error[] = "Please enter a password. Minimum of 6 characters required";
        }
        if(!empty($password) && $password == $username){
            $error[] = "Your pasword cannot be you username for security reasons";
        }
        if(empty($email)){
            $error[] = "Please enter your email address";
        }
        if(!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)){
            $error[] = "Your email address is not valid";
        }

        // connect to database
        sql_con();

        // Get instance of statement
        $stmt = mysqli_stmt_init($connect);

        // sql statement
        $UserExists = "
                    SELECT
                        `user_login`
                    FROM
                        `users`
                    WHERE
                        `user_login` = ? ";

        // prepare sql statement for execution
        if (mysqli_stmt_prepare($stmt, $UserExists)) {

            // bind parameters [s for string]
            mysqli_stmt_bind_param($stmt, "s", $username) or die(mysqli_stmt_error());
            // execute statement
            mysqli_stmt_execute($stmt) or die(mysqli_stmt_error());
            // check if username is found
            if(mysqli_stmt_num_rows($stmt) > 0 ){
                $error[] = 'The username you have choose has already been taken';
            }
        }

        // If errors found display errors
        if(!empty($error)){
            foreach($error as $msg){
                echo "$msg <br />";
            }
    } else {
            echo 'My Query Worked!';
        }
    }
    // signup.tpl template location
    $tpl = 'inc/tpl/signup.tpl';
    // load signup form template
    PageContentTemplate($tpl);
?>

<!-- CONTENT FINISH -->

<?php
    // footer.inc.php
    require_once($footer_inc);
?>

基本的に、「My Query Worked」というメッセージが表示されますが、ユーザー名が既に使用されていると言う必要があります。フォームに詳細を入力し、使用されていることがわかっているユーザー名を入力してフォームを送信すると、何かをしていることがわかります。おそらく本当にばかげていますが、mysqli やバインドパラメーターなどは初めてです。いくつかの例を見ても、どこが間違っているのかわかりません。

正直なところ、これが手続き型のスタイルでそれを行うための最良の方法であるかどうかはわかりません。PDO/OOP を知りません。変更する主な理由は、クエリでプレースホルダーなどを使用して SQL インジェクションを回避することです。

4

1 に答える 1

1

私は今それを見ます。mysqli_stmt_store_result()以前に呼び出したことがmysqli_stmt_num_rows()なく、正しい値が報告されません。

    // prepare sql statement for execution
    if (mysqli_stmt_prepare($stmt, $UserExists)) {

        // bind parameters [s for string]
        mysqli_stmt_bind_param($stmt, "s", $username) or die(mysqli_stmt_error());
        // execute statement
        mysqli_stmt_execute($stmt) or die(mysqli_stmt_error());

        // check if username is found
        // FIRST : store the store the result set so num_rows gets the right value
        mysqli_stmt_store_result($stmt);

        // Now this should be 1 instead of 0
        if(mysqli_stmt_num_rows($stmt) > 0 ){
            $error[] = 'The username you have choose has already been taken';
        }
    }

ドキュメントから:

結果セットの行数を返します。mysqli_stmt_num_rows() の使用は、mysqli_stmt_store_result() を使用して結果セット全体をステートメント ハンドルにバッファリングしたかどうかによって異なります。

mysqli_stmt_store_result() を使用すると、mysqli_stmt_num_rows() がすぐに呼び出される場合があります。

于 2012-04-10T13:45:41.997 に答える