2013-07-06 2 views
-2

Если mysqli подключается к базе данных и после if(!mysqli_stmt_execute($check)){ shouldnt this return NULL или false, если запись не найдена?Запись MYSQLi не существует.

После выполнения этой строки и проверки пользователя существует в базе данных, он не должен возвращать NULL и выходить из программы, если пользователь или запись не существует?

Как решить эту проблему, не выбирая весь набор результатов и не зацикливаясь на нем?

<?php 
    ////////////// ADDED CODE //////////// 
    $user_exists = FALSE; 
    /////////////////////////////////////// 
    $user = null; 
    $pass = null; 
    /* Connects to your Database */ 
$mysqli = mysqli_connect("localhost", "dbUser", "dbPassword","dbName"); 
     if (!$mysqli) { 
      echo "Failed to connect to MySQL: (" . $mysqli->errno . ") " . mysqli_connect_error(); 
      exit(); 
      } 

    /* create a prepared statement */ 
    $check = mysqli_prepare($mysqli, "SELECT username, password FROM users WHERE username = ?"); 

    /* bind parameters for markers */ 
    mysqli_stmt_bind_param($check, "s", $user); 
    echo $mysqli->host_info . "Mysql connected: Succes.\n"; 

    /* Checks if there is a login cookie */ 
    if (isset($_SESSION['refer'])){$location = $_SESSION['refer'];} 
    if(isset($_COOKIE['ID_my_site'])){ 
     /*if there is, it logs you in and directes you to the members page */ 
     echo "Yes there is a cookie"; 
     $user = $_COOKIE['ID_my_site']; 
     $pass = $_COOKIE['Key_my_site']; 
     } 
    /* if the login form is submitted */ 
     if (isset($_POST['submit'])) { 
      echo " Form submitted."; 
       /* if form has been submitted */ 
       /* makes sure they filled it in */ 
     if(!$_POST['username'] | !$_POST['pass']) { 
        die('You did not fill in a required field.'); 
         /* close statement */ 
         mysqli_stmt_close($check); 
         /* close connection */ 
         mysqli_close($mysqli); 
         } 
     $user = stripslashes($_POST['username']); 
     $pass = stripslashes($_POST['pass']); 
     $pass = md5($pass); 
    /* checks it against the database */ 

    /* execute query */ 
    if(!mysqli_stmt_execute($check)){ 
    die('That user does not exist in our database. <a href=Registration.php> Click Here to Register</a>');} 

    /* bind result variables */ 
    mysqli_stmt_bind_result($check, $user_column, $pass_column); 
    /* fetch value */ 
    /* Gives error if user dosen't exist */ 
     while(mysqli_stmt_fetch($check)!= NULL){ 
      /* gives error if the password is wrong */ 
      $user_exists = TRUE; 
      echo " fetch = NOT null --->> ".$user_column; 
      if ($pass != $pass_column){ 
       /* statement close */ 
       mysqli_stmt_close($check); 
       /* close connection */ 
       mysqli_close($mysqli); 
       die('Incorrect password, please try again.'); 
       } 
       } 
    if(!$user_exists){ 
    die('That user does not exist in our database. <a href=Registration.php> Click Here to Register</a>');} 

     /* if login is ok then we add a cookie */ 
     $hour = time() + 3600; 
     setcookie(ID_my_site, $user, $hour); 
     setcookie(Key_my_site, $pass, $hour); 
     /* then redirect them to the members area */ 
     header("Location: Members.php"); 
} 
    else 
    { 


    /* if they are not logged in */ 
    /* added rest of code for convenience */ 
    ?> 
    /* if they are not logged in */ 
?> 
<!DOCTYPE HTML> 
<HTML> 
<HEAD> 
<meta http-equiv="Content-type" content="text/html" charset=utf-8> 
<TITLE>Login</TITLE> 
<style> 
label,section{display:block;margin-top:20px;letter-spacing:2px;} 
form {margin:0 auto;width:60%;} 
input,textarea{width:55%;height:27px;padding:10px;margin-top:3px;background:#efefef;border:1px solid #dedede;font-size:0.9em;color:#3a3a3a;border-radius:5px;-web-border-radius:5px;-webkit-border-radius:5px;} 
textarea{height:213px;} 
input:focus,textarea:focus{border:1px solid #97d6eb;} 
.body {display:block;margin:0 auto;width:70%;} 
#submit {display:block;align:right;width:127px;height:38px;border:1px solid #dedede;margin-top:20px;cursor:pointer;} 
#submit:hover {opacity:0.9;border:1px solid #97d6eb;} 
</style> 
</head> 
<body> 
<header class="body"><label>Login page.</label></header> 
<section class ="body"> 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
     <label>Username:</label> 
     <input name="username" type="text" placeholder="Type your name here." autofocus required> 
     <label>Password</label> 
     <input name="pass" type="password" placeholder="*******************" autofocus required> 
     <input id="submit" name="submit" type="submit" value="Login"> 
    </form> 
</section> 
<footer class="body"><label>Write your footer code here.</label></footer> 
</body> 
</html> 
    <?php 
     } 
    ?> 
+0

Для меня это выглядит как пара операторов выброшенных вместе в довольно произвольном порядке. –

+0

смешно достаточно, чтобы он работал lol Я мог бы отредактировать его, чтобы посмотреть «Профессиональный» ... – Andre

+2

«Работы» - это субъективная вещь ... –

ответ

0

mysqli_stmt_execute возвращает FALSE на разбитой запросе т.е. без подключения к БД, ошибки синтаксиса, или около того. Если вы хотите проверить, не возвращает ли запрос какие-либо строки, вам не следует использовать операторы TRUE/FALSE, а также функцию execute. Вы должны использовать mysqli_num_rows, который возвращает количество строк, возвращаемое оператором SELECT. В основном, если возвращаемые строки: 0 (не false), вы должны выйти.

+0

Но вам не нужно сначала использовать store_result(), который копирует записи в массиве, а затем перебирает их, чтобы увидеть, существует ли запись? Разве это не создает много распределения памяти и дополнительных средств для процессора? – Andre

+0

Возвращает количество строк в результирующем наборе. Поведение mysqli_num_rows() зависит от того, используются ли буферизированные или небуферизованные результирующие наборы. Для небуферизованных наборов результатов mysqli_num_rows() не вернет правильное количество строк до тех пор, пока все строки результата не будут получены. http://php.net/manual/en/mysqli-result.num-rows.php – Andre

+0

В официальном документе говорится (http://www.php.net/manual/en/mysqli-result.num-rows.php): Параметры: 'Только процедурный стиль: идентификатор набора результатов, возвращаемый mysqli_query(), mysqli_store_result() или mysqli_use_result().'. Так что вам не нужно.Вы можете проверить примеры там, сразу после запроса, используется num_rows –

1

На самом деле это не ответ, но я просто не могу выдержать этот долгий и ветреный традиционный спагетти в стиле PHP. Посмотрите, есть несколько экранов кода для такой простой задачи, как получение одного значения из базы данных! Это просто странно на мой вкус.

Вот как это должно быть, по крайней мере

<?php 
/* have all the common routines included */ 
include 'bootstrap.php'; 

/* if the login form is submitted */ 
if (isset($_POST['submit'])) 
{ 
    $sql = "SELECT id, password FROM users WHERE username = ?"; 
    /* let's use some *intelligent* way to deal with database */ 
    $row = $dbal->getRow($sql, $_POST['username']); 

    /* if we got something and password is correct*/ 
    if ($row && password_verify($_POST['pass'],$row['password'])) 
    { 
     /* set user into session and redirect */ 
     $_SESSION['user'] = $row['id']; 
     header("Location: Members.php"); 
     exit; 
    } 
} 
?> 
<!DOCTYPE HTML> 
here goes HTML ... 
+0

Да, но вам нужно выделить код, чтобы заставить его работать, i recum if вы вставляете в bootstrap.php вам нужны дополнительные страницы :) – Andre

+2

У меня этот код написан один раз. Хотя у вас есть борьба с уродливыми функциями API на каждой странице. –

Смежные вопросы