1 Câu hỏi: Tại sao không phải là dữ liệu chèn dữ liệu sql của tôi vào cơ sở dữ liệu của tôi? [bản sao]

câu hỏi được tạo ra tại Thu, May 9, 2019 12:00 AM
    

Câu hỏi này đã có câu trả lời tại đây:

    

Gần đây tôi xây dựng một hệ thống đăng nhập bằng cách sử dụng php và cơ sở dữ liệu mysql. Tôi đã nhập tất cả người dùng theo cách thủ công vì vậy những gì tôi muốn làm tiếp theo là tạo ra một đăng ký funktion. Tuy nhiên, vì một số lý do, dữ liệu không có đất trong cơ sở dữ liệu của tôi.

Đây là trang đăng ký của tôi:

<div class="login">
    <div class="background">
        <img src="../pic/skyscrapers.jpg"></img>
        <div class="logbox">
            <form class="form-register" action="../func/func_register3.php" method="POST">
                <h1>Registrierung</h1>
                <div class="user">
                    Choose your username:<br>
                    <label for="frm_user">username</label>
                    <input type="text" name="frm_user" id="frm_user" placeholder="Benutzername" required autofocus>
                    <br>
                    <br>
                    Choose your password:<br>
                    <label for="frm_pass">Password</label>
                    <input type="password" name="frm_pass" id="frm_pass" placeholder="Password" required>
                    <br>
                    <br>
                    Repeat your password:<br>
                    <label for="frm_pass_rep">Repetition</label>
                    <input type="password" name="frm_pass_rep" placeholder="Password"><br>
                    <br>
                    <br>
                </div>
                <button name="btn_register" id="btn_register" type="submit">register</button>
            </form>
        </div>
    </div>
</div>

Và đây là tệp php với logic đăng ký:

<?php

if (isset($_POST['btn_register'])) {
        include("../inc/db_connect.php");

        //Form fields -> php-variables
        $frm_user = $_POST['frm_user'];
        $frm_pass = $_POST['frm_pass'];
        $frm_pass_rep = $_POST['frm_pass_rep'];

        $stmt = $dbh->prepare("INSERT INTO tbl_users (username, password) VALUES (:frm_user, :frm_pass)");
        $stmt->bindParam(':frm_user', $frm_user);
        $stmt->bindParam(':frm_pass', $frm_pass);

    if ($stmt->execute() == true):
        echo "All good!";
        else:
        {
            echo "The statement has not been executed!";
            echo "<br>";
            echo print_r($stmt->errorInfo, true);
            echo "<br>";
            echo $stmt->errorCode();
        }
        endif;
}

Đầu ra là "Câu lệnh chưa được thực thi! 23000" là đúng, không có dữ liệu nào đi vào cơ sở dữ liệu ... Tôi đã thử sử dụng các loại trình duyệt khác nhau và sử dụng cơ sở dữ liệu anonther. Việc đăng nhập hoạt động rất tốt và cả hai tệp, tệp có log-logik cũng như tệp có đăng ký-logik, sử dụng cùng một tệp để kết nối với cơ sở dữ liệu. Tôi rất biết ơn về tất cả các loại ý tưởng về cách khắc phục điều này.

    
- 2
  1. Không bao giờ lưu trữ mật khẩu văn bản đơn giản! Vui lòng sử dụng PHP's các hàm tích hợp để xử lý bảo mật mật khẩu. Nếu bạn đang sử dụng phiên bản PHP dưới 5,5, bạn có thể sử dụng password_hash() gói tương thích . Không cần thiết phải mật khẩu thoát hoặc sử dụng bất kỳ cách dọn dẹp nào khác cơ chế trên chúng trước khi băm. Làm như vậy thay đổi mật khẩu và gây ra mã hóa bổ sung không cần thiết.
    2019-05-09 13: 41: 54Z
  2. Bạn đã kiểm tra nhật ký lỗi của mình chưa?
    2019-05-09 13: 42: 05Z
  3. $stmt của bạn có thể ổn nhưng bạn không thực sự kiểm tra giá trị trả về vào $stmt->execute()
    2019-05-09 13: 45: 11Z
  4. Câu lệnh của bạn là một đối tượng. Nó sẽ không biến đổi một cách kỳ diệu thành một boolean false sau một truy vấn không thành công. Có, bạn cần kiểm tra giá trị trả về của execute().
    2019-05-09 13: 48: 53Z
  5. echo "The statement has not been executed: " . print_r($stmt->errorInfo, true); để nhận lỗi thực tế liên quan
    2019-05-09 14: 07: 48Z
1 Đáp án                              1                         

Tôi đoán rằng cột id của bạn là tự động tăng. Bạn nên xóa nó khỏi truy vấn của mình:

$stmt = $dbh->prepare("INSERT INTO tbl_users (username, password) VALUES (:frm_user, :frm_pass)");

hoặc nếu không tự động hoặc bạn muốn cung cấp cho nó một giá trị, bạn nên chèn một giá trị cho nó:

$stmt = $dbh->prepare("INSERT INTO tbl_users (id, username, password) VALUES (:id,:frm_user, :frm_pass)");
    
- 1
2019-05-09 13: 44: 58Z
  1. Tôi muốn khuyên bạn không trả lời câu hỏi có nhiều rò rỉ trong đó. Câu trả lời có thể đúng nhưng có thể đặt một số nỗ lực để đảm bảo an toàn.
    2019-05-09 13: 46: 18Z
  2. Câu trả lời này không còn phản ánh nội dung bài đăng. Id không được tham chiếu ở bất kỳ đâu trong truy vấn.
    2019-05-09 13:57:55Z
  3. @ nacho Có, cột id là tự động tăng. Tôi vừa gỡ nó ra, thử lại lần nữa nhưng nhận được kết quả tương tự ... Để cung cấp cho bạn thêm thông tin về bảng, có bốn cột. "id" của kiểu int (11) là khóa chính và được tự động hóa, "tên người dùng" của loại varchar (25), "mật khẩu" của loại varchar (22) và "admin" của loại tinyint (1). Quản trị viên được đặt thành 0 trên mỗi mặc định có nghĩa là người dùng doenet có quyền quản trị viên.
    2019-05-09 13: 59: 31Z
  4. "Tôi đoán" - đừng đoán.
    2019-05-09 14: 33: 43Z
nguồn đặt đây