2016-04-25 3 views
-1

Я пытаюсь написать программу для своей тестовой лаборатории с окнами 2012 + MySQL + IIS + PHP, моя программа считывает базу данных, но когда я пытаюсь записать данные в в базе данных он показывает «Array ([id] => 0)», это означает, что моя программа не записывает данные в базу данных, в чем проблема? Я начинаю писать программу, пожалуйста, помогите мне? Мой код в соответствии с:PHP Array ([id] => 0)

<?php 

session_start(); 

error_reporting(E_ALL & ~E_NOTICE); 

// Connect to Database 

$link = mysqli_connect("localhost", "root", "password", "admin"); 

// Connection Status 

if ($link->connect_error) { 

    die ("Connection Failed : " . $link->connect_error); 
} 

if ($_POST['submit']) { 

    if (!$_POST['email']) 
     $error .= "<br />Bitte trage deine Email Addresse ein !"; 

    else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
     $error .= "<br />Bitte eine korrekte email Address ein !"; 

    if (!$_POST['password']) 
     $error .= "<br />Bitte trage dein Passwort ein !"; 

    else { 
     if (strlen($_POST['password']) < 8) 
      $error .= "<br />Bitte trage ein längeres Password ein !"; 

     if (!preg_match('`[A-Z]`', $_POST['password'])) 
      $error .= "<br />Bitte nutze ein Großbuchstaben password ein !"; 

    } 

    if (isset($error)) 
     echo "Es gab fehler in deinem Login Details : " . $error; 

    else { 

     $query = "SELECT * FROM `benutzer` WHERE email ='" . mysqli_real_escape_string($link, $_POST['email']) . "'"; 

     $result = mysqli_query($link, $query); 

     $results = mysqli_num_rows($result); 

     if ($results) echo "Die eMailaddresse ist bereits vergeben. <br />Möchtest do dich einloggen ?"; 

      $query = "INSERT INTO benutzer (email, password) VALUES ('" . mysqli_real_escape_string($link, $_POST['email']) . "', '" . md5(md5($_POST['email']) . $_POST['password']) . "')"; 

      mysqli_query($link, $query); 

      echo "<br />Du hast dich erfolgreich registriert ! "; 

      $_SESSION['id'] = mysqli_insert_id($link); 

      print_r($_SESSION); 


    } 

} 

?> 



<form method="post"> 

    <input type="email" name="email" id="email" id="email" /> 
    <input type="password" name="password" /> 
    <input type="submit" name="submit" value="Einlogen" /> 

</form> 
+2

Ваши заявления if/else беспорядок. Я бы предложил использовать фигурные скобки '{}' для всех. Скорее всего, вы обнаружите синтаксическую ошибку, которая после исправления устранит вашу проблему. По крайней мере, если вы отредактируете свой очищенный код в своем вопросе, нам будет намного легче увидеть, что происходит. – amflare

+0

также вставить "echo mysqli_error ($ link);" после вызова mysqli_query – strangeqargo

+0

** ПРЕДУПРЕЖДЕНИЕ **: при использовании 'mysqli' вы должны использовать параметризованные запросы и [' bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php), чтобы добавить данные пользователя в ваш запрос. ** НЕ используйте ** интерполирование строк или конкатенацию, чтобы выполнить это, потому что вы создадите серьезные [SQL-инъекции ошибок] (http: // bobby-tables.com /), если вы сделаете простую ошибку. – tadman

ответ

0

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

  • MySQLi реальная строка побег не хватает, чтобы защитить вас от SQL инъекций.

  • MD5 - неподходящий хеширующий механизм для паролей, вы должны использовать PHP password_hash. Используй это.

  • использование MySQLi_error($link) обратной связи, что случилось с SQL запроса:

Итак:

mysqli_query($link, $query) or die("line ".__LINE__." :".mysqli_error($link)); 

Один большой шаг вы можете сделать это, чтобы использовать MySQLi Prepared statements (изначально на самом деле более безопасным, чем более популярный PDO, поскольку они используют fully prepared statements с самого начала)

0

Вы можете проверить, действительно ли программа выполнила запрос INSERT, проверяя, возвращает ли mysqli_query значение true.

Кроме того, mysqli_insert_id будет возвращать 0 в первый раз, тогда начнется подсчет, хотя он может создавать проблемы в некоторых базах данных. Вы можете получить идентификатор из mysqli_num_rows() - 1

Заменить этот код после если ($ результатов)

if(mysqli_query($link, $query)) 
{ 
    echo "<br />Du hast dich erfolgreich registriert ! "; 

    $query = "SELECT * FROM `benutzer`"; 

    $result = mysqli_query($link, $query); 

    $results = mysqli_num_rows($result); 

    $_SESSION['id'] = $results-1; 

    print_r($_SESSION); 
} 
else 
    echo "Error inserting data!"; 
+0

Hi @TSahoo если этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), щелкнув галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – Ofir

0

Исключения составляет ваш друг, и могут легко избежать таких неприятных и трудно чтобы следить за вложенными блоками, которые вы здесь делаете. Это должно быть легко прочитать ваш скрипт и следовать логике.

Вот краткий пример с исключениями и функциями, инкапсулирующими интересующие области.

function dbConnect() 
{ 
    $link = mysqli_connect("localhost", "root", "[email protected]", "admin"); 
    if($link->connect_error) 
    { 
     throw new Exception($link->connect_error); 
    } 
} 

function checkRequiredValues() 
{ 
    // initialize $error before beginning. 
    $error = ''; 

    // Check email address 
    if (empty($_POST['email'])) 
    { 
      $error .= "<br />Bitte trage deine Email Addresse ein !"; 
    } 
    else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
    { 
      $error .= "<br />Bitte eine korrekte email Address ein !"; 
    } 

    // Check password. 
    if (empty($_POST['password'])) 
    { 
     $error .= "<br />Bitte trage dein Passwort ein !"; 
    } 
    else if (strlen($_POST['password']) < 8) 
    { 
     $error .= "<br />Bitte trage ein längeres Password ein !"; 
    } 
    else if (!preg_match('`[A-Z]`', $_POST['password'])) 
    { 
     $error .= "<br />Bitte nutze ein Großbuchstaben password ein !"; 
    } 
    if (isset($error)) 
    { 
     throw new Exception("Es gab fehler in deinem Login Details : " . $error); 
    } 
} 




// use !empty here to avoid a warning if post['submit'] is not set 
if(!empty($_POST['submit'])) 
{ 
    try 
    { 
     checkRequiredValues(); 
     // Do this second. There is no need to establish a DB 
     // connection if we won't be using it. 
     dbConnect(); 
     doUpdate(); 
    } 
    catch(\Exception $e) 
    { 
     $e->getMessage(); 
    } 
} 

Я оставлю вам функцию doUpdate. Обратите внимание, что то, что сказал другой плакат об использовании связанных параметров, является правильным.

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