PHP – Неопределенная переменная

Я новичок в PHP.

В настоящее время на стадии обучения.

Я делаю некоторые упражнения от Beginners PHP & MySQL от г-на Таккера.

На его примере все работает нормально, но на моем ПК есть ошибка:

Notice: Undefined variable: passwordRetrieved in C:\wamp\www\loginForm.php on line 39 .

Полный код PHP для этого примера: – обратите внимание, что таблица существует, пароль, соединение с БД и т. Д. … верны

 <?php { // Secure Connection Script include('htconfig/dbConfig.php'); $dbSuccess = false; $dbConnected = mysql_connect($db['hostname'],$db['username'],$db['password']); if ($dbConnected) { $dbSelected = mysql_select_db($db['database'],$dbConnected); if ($dbSelected) { $dbSuccess = true; } } // END Secure Connection Script } $thisScriptName = "loginForm.php"; echo '<h2>Login Form </h2>'; $username = $_POST['username']; if(isset($username)) { $password = $_POST['password']; echo "username = ".$username."<br />"; echo "password = ".$password."<br />"; { // SELECT password for this user from the DB and see it it matches $tUser_SQLselect = "SELECT password FROM tUser "; $tUser_SQLselect .= "WHERE username = '".$username."' "; $tUser_SQLselect_Query = mysql_query($tUser_SQLselect); while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { $passwordRetrieved = $row['password']; } mysql_free_result($tUser_SQLselect_Query); echo "passwordRetrieved = ".$passwordRetrieved."<br />"; if (!empty($passwordRetrieved) AND ($password == $passwordRetrieved)) { echo "YES. Password matches.<br /><br />"; echo '<a href="'.$thisScriptName.'">Logout</a>'; } else { echo "Access denied.<br /><br />"; echo '<a href="'.$thisScriptName.'">Try again</a>'; } } } else { echo '<form name="postLoginHid" action="'.$thisScriptName.'" method="post">'; echo ' <P>User name: <INPUT TYPE=text NAME=username value=""></P> <P>Password: <INPUT TYPE=password NAME=password value=""></P> <input type="submit" value="Login" /> '; echo '</form>'; } echo '<h2>--------- END Login Form --------</h2>'; ?> в <?php { // Secure Connection Script include('htconfig/dbConfig.php'); $dbSuccess = false; $dbConnected = mysql_connect($db['hostname'],$db['username'],$db['password']); if ($dbConnected) { $dbSelected = mysql_select_db($db['database'],$dbConnected); if ($dbSelected) { $dbSuccess = true; } } // END Secure Connection Script } $thisScriptName = "loginForm.php"; echo '<h2>Login Form </h2>'; $username = $_POST['username']; if(isset($username)) { $password = $_POST['password']; echo "username = ".$username."<br />"; echo "password = ".$password."<br />"; { // SELECT password for this user from the DB and see it it matches $tUser_SQLselect = "SELECT password FROM tUser "; $tUser_SQLselect .= "WHERE username = '".$username."' "; $tUser_SQLselect_Query = mysql_query($tUser_SQLselect); while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { $passwordRetrieved = $row['password']; } mysql_free_result($tUser_SQLselect_Query); echo "passwordRetrieved = ".$passwordRetrieved."<br />"; if (!empty($passwordRetrieved) AND ($password == $passwordRetrieved)) { echo "YES. Password matches.<br /><br />"; echo '<a href="'.$thisScriptName.'">Logout</a>'; } else { echo "Access denied.<br /><br />"; echo '<a href="'.$thisScriptName.'">Try again</a>'; } } } else { echo '<form name="postLoginHid" action="'.$thisScriptName.'" method="post">'; echo ' <P>User name: <INPUT TYPE=text NAME=username value=""></P> <P>Password: <INPUT TYPE=password NAME=password value=""></P> <input type="submit" value="Login" /> '; echo '</form>'; } echo '<h2>--------- END Login Form --------</h2>'; ?> 

перед тем, как вы установите переменную $ passwordRetrieved, объявите ее так, чтобы она выглядела так:

 $tUser_SQLselect_Query = mysql_query($tUser_SQLselect); $passwordRetrieved = ""; while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { $passwordRetrieved = $row['password']; } 

Это потому, что ваш запрос ничего не ответил и ваш

while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) {

не заполнил

$passwordRetrieved

Вы можете отключить уведомления E_NOTICE, потому что это не то, что может повредить

Или добавить

 $passwordRetrieved = ""; 

перед вашим

 while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { 
 while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { $passwordRetrieved = $row['password']; } 

это единственное место, где значение может быть присвоено переменной $passwordRetrieved .
Если в результирующем наборе нет записи, цикл цикла while никогда не выполняется, и поэтому никогда не присваивается значение $passwordRetrieved и поэтому $passwordRetrieved не существует / не определено в строке 39 -> Notice: Undefined variable: passwordRetrieved in C:\wamp\www\loginForm.php on line 39 .

Вы пытаетесь получить доступ к переменной $passwordRetrieved когда ей еще не присвоено значение. Доступ осуществляется здесь:

 echo "passwordRetrieved = ".$passwordRetrieved."<br />"; 

Переменная будет установлена ​​чуть выше:

 while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { $passwordRetrieved = $row['password']; // VARIABLE SET HERE } 

Важно то, что переменная только устанавливается, если запрос возвращает соответствующую строку (т. Е. При успешном входе в систему). Если логин недействителен, переменная не установлена.

Чтобы проверить, установлена ​​ли переменная без уведомления, вы должны использовать либо isset либо empty (есть тонкие различия, но, как правило, вы можете использовать большую часть времени). Ваш код на самом деле уже делает это чуть ниже:

 // Checking if $passwordRetrieved has been set using empty() if (!empty($passwordRetrieved) AND ($password == $passwordRetrieved)) { 

если ваш запрос не дал никаких результатов, то $ passwordRetrieved не определен (как говорится в сообщении). вам следует выбросить ошибку, если вы не смогли найти пользователей с именем пользователя = $ username (что также является недопустимым логином)

вы просто используете неопределенную переменную, если цикл while не работает, ваша переменная сталь не определена, поэтому вы получаете ошибку 🙂

выполните проверку с помощью mysql_num_rows($result) чтобы убедиться, что у вас есть что-то.

Перед использованием следует определить $passwordRetrieved . Это уведомление не действует вообще. Чтобы избежать этого, определите это:

 $thisScriptName = "loginForm.php"; $passwordRetrieved; 

Поскольку этот вопрос уже был дан ответ, я бы также добавил вместо использования mysql_fetch_array с параметром MYSQL_ASSOC, вы можете просто использовать mysql_fetch_assoc () 🙂