Saya memiliki pernyataan siap berikut:

            $stmt = $conn->prepare("SELECT * FROM `users` WHERE user LIKE ? ");
            $stmt->bind_param("s", $filtered_form['user']);
            $stmt->execute();
            $stmt->store_result();
            if ($stmt->num_rows > 0) {
               $stmt->bind_result($id, $user, $pass, $first, $last, $type, $email);
               $stmt->fetch();
               $stmt->close();
            }
            if ($pass === $filtered_form['pass']) {
               $_SESSION['id'] = $id;
               $_SESSION['user'] = $user;
               $_SESSION['first'] = $first;
               $_SESSION['last'] = $last;
               $_SESSION['email'] = $email;
               $_SESSION['type'] = $type;
               header("Location:index.php");
               exit;
            } else {
               return "Incorrect password";
            }

Namun Visual Studio mengatakan ada masalah bahwa variabel $id, $user, $pass, $first, $last, $type, $email tidak ditentukan. Saya menambahkan variabel seperti ini:

            $stmt = $conn->prepare("SELECT * FROM `users` WHERE user LIKE ? ");
            $stmt->bind_param("s", $filtered_form['user']);
            $stmt->execute();
            $stmt->store_result();
            if ($stmt->num_rows > 0) {
               $id  = "";
               $user = "";
               $pass = "";
               $first = "";
               $last = "";
               $type = "";
               $email = "";
               $stmt->bind_result($id, $user, $pass, $first, $last, $type, $email);
               $stmt->fetch();
               $stmt->close();
            }
            if ($pass === $filtered_form['pass']) {
               $_SESSION['id'] = $id;
               $_SESSION['user'] = $user;
               $_SESSION['first'] = $first;
               $_SESSION['last'] = $last;
               $_SESSION['email'] = $email;
               $_SESSION['type'] = $type;
               header("Location:index.php");
               exit;
            } else {
               return "Incorrect password";
            }

Dan masalahnya hilang. Setelah meninjau dokumentasi PHP, saya tidak dapat menemukan contoh di mana variabel harus didefinisikan terlebih dahulu, namun visual studio masih menunjukkannya sebagai kesalahan. ada yang tahu ini kenapa?

0
xelfury 3 Juli 2020, 09:14

1 menjawab

Jawaban Terbaik

Tidak, itu tidak perlu ketika variabel dilewatkan dengan referensi, yang terjadi di sini. Jadi Visual Studio yang salah di sini.

Namun, Anda menggunakan teknik usang di sini, dan dapat menghilangkan peringatan positif palsu ini dan mengurangi jumlah kode sekaligus:

        $stmt = $conn->prepare("SELECT * FROM `users` WHERE user = ? ");
        $stmt->bind_param("s", $filtered_form['user']);
        $stmt->execute();
        $row = $stmt->get_result()->fetch_assoc();
        if ($row and password_verify($filtered_form['pass'], $row['pass']) {
           $_SESSION['user'] = $row;
           header("Location:index.php");
           exit;
        } else {
           return "Incorrect password";
        }

Seperti yang Anda lihat, get_result() memberi Anda hasil yang jauh lebih baik daripada store_result(), memungkinkan Anda untuk menyimpan informasi pengguna dalam satu variabel, sehingga menang jangan mengotori larik $_SESSION.

Dan num_rows() terbukti sama sekali tidak berguna (seperti yang selalu terjadi).

Catatan penting: Anda tidak boleh menyimpan sandi dalam teks biasa. Selalu gunakan sandi hash sebagai gantinya.

2
Your Common Sense 3 Juli 2020, 06:34