Нужно ли мне использовать $ stmt = $ conn-> prepare для этого подготовленного оператора? - PullRequest
0 голосов
/ 09 февраля 2019

Текущий синтаксис для моих подготовленных операторов неверен, где я: (INSERT ...?,?,?)

Я пытался скопировать синтаксис из разных примеров, но, похоже, чем больше я пытаюсьбольше я ломаю свою систему входа в систему.У меня есть несколько противоречивых примеров, и я не уверен, какой синтаксис является правильным для использования.Нужно ли использовать $ stmt = $ conn-> prepare перед INSERT?

// create preprepared statement
$sql = "INSERT INTO `user` (username, password, email) VALUES (?, ?, ?)";

// check if sql statement is correct
if ($stmt = mysqli_prepare($connection, $sql)) {

    // Add the variables to the stmt
    mysqli_stmt_bind_param($stmt, "sss", $param_username, $param_hashed_password, $param_email);
    $param_username = $username;
    $param_password = $hashed_password;
    $param_email = $email;

    // Attempt to execute the stmt
    if(mysqli_stmt_execute($stmt)) {
        // If statement executed
        $_SESSION["username"] = $username;
        header("location: login.php");

В данный момент он не вставляет никаких значений в мою базу данных, и регистрация пользователя не выполняется.

EDIT:

$ password = $ _POST ['password'];

$ hashed_password = password_hash ($ password, PASSWORD_DEFAULT);

Мне только что пришло в голову, что это может бытьневерное использование password_hash?

1 Ответ

0 голосов
/ 09 февраля 2019

Do i need to use "$stmt = $conn->prepare" for this prepared statement? - короче, нет!Тем не менее, вы должны использовать метод prepare для фактического генерирования prepared statement, это ДОЛЖНО быть сделано до фактической попытки сделать INSERT, и имеет смысл присвоить это переменной, чтобы вы могли разветвлять программную логику в зависимости отуспех / провал.

Я предпочитаю сделать следующее: используйте блок try/catch и используйте возвращаемые значения или переменные на разных этапах, чтобы определить, следует ли генерировать значимые (?) Исключения, чтобы помочь отладке - в качестве примера вы могли бы сделатьэто

/*
    assumed that $username,$password & $email 
    are all defined and available at ths stage.

    also assumed that `session_start()` has 
    been called and that no html output occurs
    before this point ( unless using output buffering )
*/

try{
    # example

    $sql = "INSERT INTO `user` ( `username`, `password`, `email` ) VALUES (?, ?, ?)";
    $stmt = $connection->prepare( $sql );

    if( $stmt ){
        /* if there were no problems continue with the database operations */
        $stmt->bind_param('sss', $username, $hash, $email );

        /* not sure how the hash was generated so just put this in to be sure... */
        $hash = password_hash( $password, PASSWORD_BCRYPT );

        $result = $stmt->execute();
        $stmt->free_result();
        $stmt->close();

        if( $result ){
            $_SESSION['username'] = $username;
            exit( header( 'Location: login.php' ) );
        } else {
            throw new Exception('Bogus! There was some sort of problem...');
        }
    } else {
        throw new Exception('Failed to prepare sql query');
    }
}catch( Exception $e ){
    exit( $e->getMessage() );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...