2015-12-18 2 views
0

Я хотел бы получить четкую информацию или ответить, как решить следующую проблему.Вход в систему с mysqli

В настоящее время я использовал соединение MySQL, но теперь я хочу перейти на MySQLi. Я не хочу использовать PDO, поэтому, пожалуйста, не предпочитайте этого.

Новый код mysqli это, но его не работает, и я думаю, что я использовал слишком много другого, что не нужно.

<?php 
include('includes/functions.php'); 
session_start(); 
if(isset($_POST['login'])) { 
if(isset($_POST['username'])) { 
    if(isset($_POST['password'])) { 
     $username = $_POST['username']; 
     mysqli_query($query, "SELECT * FROM cm_users WHERE Username = '$username'") or die(mysql_error()); 
     foreach ($query as $user) 
     if(sha3($_POST['password'],256) == $user['Password']) { 
      $_SESSION['user'] = $user['Username']; 
     if(isset($_POST['g-recaptcha-response'])){ 
      $captcha=$_POST['g-recaptcha-response']; 
      } 
     if(!$captcha){ 
      header("Location: login.php"); 
      echo "<button class='btn btn-block btn-warning btn-sm'>Please check your login details.</button>"; 
     exit; 
     } 
     $response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=******&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']); 
     if($response.success==false) 
     { 
     echo '<h2>You are spammer ! Get the @$%K out</h2>'; 
     } else { 
     echo '<h2>Thanks for posting comment.</h2>'; 
     } 
      header("Location: redirect.php"); 
     } else { 
      echo "<button class='btn btn-block btn-warning btn-sm'>Please check your login details.</button>"; 
      include('login.php'); 
     } 
     } else { 
      echo "<button class='btn btn-block btn-warning btn-sm'>Please check that you filled out the login form!</button>"; 
      include('login.php'); 
     } 
} 
} 
?> 

Любая идея, как решить проблему, чтобы получить работу?

+1

вы все еще смешивая API, с помощью 'mysql_error()' и мы не знаем, если ваше соединение фактически 'mysqli_', и это неизвестно. Проверьте реальные ошибки. Мы также не знаем, содержат ли ваши массивы POST значения или нет. –

+0

Какие у вас ошибки? Что такое запрос? Пожалуйста, предоставьте еще один код – Dacaspex

+0

, тогда у вас есть куча эхо с заголовками, поэтому вы можете выводить перед заголовком. Отчет об ошибках. –

ответ

1

Создание этого как вики - У меня нет ничего, чтобы получить от этого? , но больше для OP и будущих посетителей вопроса.


Вытащил из комментариев и слегка изменен:

Во-первых, вы все еще смешивая API, с помощью mysql_error(), где он должен читаться как mysqli_error($query) при условии, что $query ваша переменная соединение используется в ваших кодов подключения.

Тогда это не удается вам foreach ($query as $user), потому что нет ничего назначено $query (для запроса), как вы проверяете в foreach против переменного вашей БД СОЕДИНЕНИЯ и что сам по себе должны быть брошены вам ошибку, если бы вы использовали правильную ошибку функция.

Быть mysqli_error($query) где эта функция требует подключения к базе данных в качестве параметра.

Ваш нынешний код открыт для SQL injection. Использовать mysqli_* with prepared statements, или PDO с prepared statements.

Как и было предложено, используйте один из ответов ircmaxell и используйте лучшую функцию хэширования/запроса.

Вытащил из его ответа:

Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.

  • PHP 5.5+: использовать password_hash()
  • PHP 5.3.7+: использовать password-compat (пакет обеспечения совместимости для выше)
  • Все другие: использовать phpass

Не делайте это сами. Если вы создаете свою соль, ВЫ МОЖЕТЕ НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.

$dbh = new PDO(...); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); 
$stmt->execute([$username, $email, $hash]); 

А на входе:

$sql = "SELECT * FROM users WHERE username = ?"; 
$stmt = $dbh->prepare($sql); 
$result = $stmt->execute([$_POST['username']]); 
$users = $result->fetchAll(); 
if (isset($users[0]) { 
    if (password_verify($_POST['password'], $users[0]->password) { 
     // valid login 
    } else { 
     // invalid password 
    } 
} else { 
    // invalid username 
} 
0

@fred -ii- ответил на мой вопрос, так что он помог много :)

и там вы идете ;-) назначить переменную в запросе, кроме подключения к БД. решена. $other_var = mysqli_query($connection, query)... и используйте эту переменную в вашем foreach. вы хотите, чтобы мои комментарии были ответом? ;-) - Фред -ii-

test = mysqli_query($query, "SELECT * FROM cm_users WHERE Username = '$username'") or die(mysqli_error($query)); foreach ($test as $user) так: D

вы пропустили $ --- $test = mysqli_query.... sure. then foreach($test..). - Фред -ii-

+0

На самом деле это не ответ здесь. Marcell. Я считаю, что если бы вы хотели получить реальный ответ, я бы включил мои комментарии в один. на самом деле комментарий. Вы можете получить для него нисходящее движение: (но приветствую вас, и я был рад помочь. –

+0

Исправлено: P теперь должно быть в порядке – Marcell

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