2015-12-23 3 views
0

Я пытаюсь создать скрипт регистрации, используя PHP с базой данных Mysql. Вставка не может быть выполнена. Если я зарегистрирую идентификатор электронной почты, который уже находится в базе данных, он работает нормально. Но скрипт не вставляет новые записи. Он возвращает «bool (false)». Я пробовал делать то же самое с помощью PDO. Вставка не может быть выполнена. Итак, я попробовал mysqli подготовленные заявления, и даже это дает тот же результат. Вот код.Что не так в этих подготовленных операциях mysqli?

<?php 

$dbh = new mysqli('localhost', 'user', 'pass', 'db'); 

if(isset($_POST['register'])){ 

     $ip = $_SERVER['REMOTE_ADDR']; 
     $name = $_POST['$name']; 
     $mail = $_POST['mail']; 
     $passw = $_POST['passw']; 
     $codeone = $_POST['codeone']; 
     $descs = $_POST['desc']; 
     $newstrings = 'specialstring'; 
     $encrypted_pass = crypt($passw); 

     $stmt = $dbh->prepare("SELECT mail FROM userrecs WHERE mail=?"); 
     $stmt->bind_param('s',$mail); 


     if($stmt->execute()) 
     { 
     $stmt->store_result(); 
     $rows = $stmt->num_rows; 
     if($rows == 1) 
      { 
        session_start(); 
        $_SESSION['notification_one'] = 'bla'; 
        header('location:/someplace'); 
       } 

       else { 
        $statement = $db->prepare("INSERT INTO userrecs (ip,name,mail,pass,codeone_one,desc_one,spcstrings) VALUES (?,?,?,?,?,?,?)"); 
       $statement->bind_param('ssssiss',$ip,$name,$mail,$encrypted_pass,$codeone,$descs,$newstrings); 

try { 
    if($statement->execute()) 
    { 
      session_start(); 
      $_SESSION['noti_two'] = 'bla'; 
      header('location:/someplace'); 
       } 
       else 
       { 
       var_dump($statement->execute()); 
       $statement->errorInfo(); 
       } 
    } 
    catch(PDOException $pe) { 
     echo "S"; 
    echo('Connection error, because: ' .$pe->getMessage()); 
    }  
       } 
     } 
    } 
    else{ 
     header('location:/someplace'); 
    } 
?> 

EDIT:

Это PDO только код. Я смешивал PDO и mysqli в предыдущем коде.

<?php 


$dsn = 'mysql:dbname=dbname;host=localhost'; 
$user = 'user'; 
$password = 'pass'; 
    $dbh = new PDO($dsn, $user, $password); 

if(isset($_POST['regsubmit'])){ 

     $ip = $_SERVER['REMOTE_ADDR']; 
     $name = $_POST['$name']; 
     $mail = $_POST['mail']; 
     $pass = $_POST['passw']; 
     $codeone = $_POST['codeone']; 
     $descs = $_POST['desc']; 
     $newstrings = 'specialstring'; 
     $encrypted_pass = crypt($passw); 


     $sql = "SELECT mail FROM userrecs WHERE mail=:mail"; 
     $statement = $dbh->prepare($sql); 
     $statement->bindValue(':mail',$mail,PDO::PARAM_STR); 

     if($statement->execute()) 
      { 
       if($statement->rowCount() == 1) 
       { 
         session_start(); 
        $_SESSION['noti_one'] = 'bla'; 
        header('location:/someplace'); 
       } 

       else { 
       $sql2 = "INSERT INTO userrecs (ip,name,mail,pass,codeone_one,desc_one,spcstrings) VALUES (:ip,:name,:mail,:encrypted_pass,:codeone,:descs,:newstrings)"; 

       $stmt = $dbh->prepare($sql2); 
       $stmt->bindParam(':ip',$ip,PDO::PARAM_STR); 
       $stmt->bindParam(':name',$name,PDO::PARAM_STR); 
$stmt->bindValue(':mail',$mail,PDO::PARAM_STR); 
$stmt->bindParam(':encrypted_pass',$encrypted_pass,PDO::PARAM_STR); 
$stmt->bindParam(':codeone',$codeone,PDO::PARAM_STR); 
$stmt->bindParam(':descs',$descs,PDO::PARAM_STR); 
$stmt->bindParam(':newstrings',$temstr,PDO::PARAM_STR); 

try { 
    if($stmt->execute()) 
    { 

      session_start(); 
      $_SESSION['noti_two'] = 'bla'; 
      header('location:/someplace'); 
       } 
       else 
       { 
       var_dump($stmt->execute()); 
       $stmt->errorInfo(); 
       } 
    } 
    catch(PDOException $pe) { 
     echo "S"; 
    echo('Connection error, because: ' .$pe->getMessage()); 
    } 
       } 

     } 
    } 
    else{ 
     header('location:/someplace'); 
    } 
?> 

Игнорируйте переменные или таблицу имен. Здесь я редактировал некоторые имена.

+1

..can вы proide сообщение об ошибке? Каков результат ошибки $ dbh->? – ThatMSG

+0

Вы должны сказать mysqli, чтобы бросать исключения, когда что-то идет не так: 'mysqli_report (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);' – jeroen

ответ

0

Я считаю, что у вас есть ошибка в вашей логике. Попробуйте этот код и посмотреть, что получится ...

<?php 

$dbh = new mysqli('localhost', 'user', 'pass', 'db'); 

if(isset($_POST['register'])) { 

    $ip = $_SERVER['REMOTE_ADDR']; 
    $name = $_POST['$name']; 
    $mail = $_POST['mail']; 
    $passw = $_POST['passw']; 
    $codeone = $_POST['codeone']; 
    $descs = $_POST['desc']; 
    $newstrings = 'specialstring'; 
    $encrypted_pass = crypt($passw); 

    $stmt = $dbh->prepare("SELECT mail FROM userrecs WHERE mail=?"); 
    $stmt->bind_param('s', $mail); 
    $test = $stmt->execute(); 
    if($test) { 
     $stmt->store_result(); 
     $rows = $stmt->num_rows; 
     if($rows == 1) { 
      session_start(); 
      $_SESSION['notification_one'] = 'bla'; 
      header('location:/someplace'); 
     } else { 
      $statement = $db->prepare("INSERT INTO userrecs (ip,name,mail,pass,codeone_one,desc_one,spcstrings) VALUES (?,?,?,?,?,?,?)"); 
      $statement->bind_param('ssssiss', $ip, $name, $mail, $encrypted_pass, $codeone, $descs, $newstrings); 

      try { 
       if($statement->execute()) { 
        session_start(); 
        $_SESSION['noti_two'] = 'bla'; 
        header('location:/someplace'); 
       } else { 
        var_dump($statement->execute()); 
        $statement->errorInfo(); 
       } 
      } catch (PDOException $pe) { 
       echo "S"; 
       echo('Connection error, because: ' . $pe->getMessage()); 
      } 
     } 
    }else{ 
     echo "test is not ok"; 
     var_dump($test); 
    } 
} else { 
    header('location:/someplace'); 
} 
+0

То же самое. Точно такие же результаты. –

0

Вы смешиваете PDO и Mysqli драйвер в том же сценарии, это не представляется возможным.

Пожалуйста, используйте любой из них, но не тот и другой.

PDO является предпочтительным расширением.


EDIT:

В запросе:

INSERT INTO userrecs (ip,name,mail,pass,codeone_one,desc_one,spcstrings) VALUES (...) 

NAME является mysql reserved keyword, вы избежать его, используя обратные кавычки:

INSERT INTO userrecs (ip,`name`,mail,pass,codeone_one,desc_one,spcstrings) VALUES (...) 

EDIT:

Изменить

var_dump($statement->execute()); 
$statement->errorInfo(); 

в

var_dump($statement->errorInfo()); 

EDIT:

$dsn = 'mysql:dbname=dbname;host=localhost'; 
$user = 'user'; 
$password = 'pass'; 
$dbh = new PDO($dsn, $user, $password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
if (isset($_POST['regsubmit'])) { 
    try { 
     $sql = "SELECT mail FROM userrecs WHERE mail=:mail"; 
     $stmt = $dbh->prepare($sql); 
     $stmt->bindValue(':mail', $_POST['mail'], PDO::PARAM_STR); 
     if ($stmt->execute() && $stmt->rowCount() == 1) { 
      session_start(); 
      $_SESSION['noti_one'] = 'bla'; 
      header('location:/someplace'); 
     } else { 
      $sql = "INSERT INTO userrecs (ip,name,mail,pass,codeone_one,desc_one,spcstrings) VALUES (:ip,:name,:mail,:encrypted_pass,:codeone,:descs,:newstrings)"; 
      $stmt = $dbh->prepare($sql); 
      $stmt->bindValue(':ip', $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR); 
      $stmt->bindValue(':name', $_POST['$name'], PDO::PARAM_STR); 
      $stmt->bindValue(':mail', $_POST['mail'], PDO::PARAM_STR); 
      $stmt->bindValue(':encrypted_pass', crypt($_POST['passw']), PDO::PARAM_STR); 
      $stmt->bindValue(':codeone', $_POST['codeone'], PDO::PARAM_STR); 
      $stmt->bindValue(':descs', $_POST['desc'], PDO::PARAM_STR); 
      $stmt->bindValue(':newstrings', 'specialstring', PDO::PARAM_STR); 

      if ($stmt->execute()) { 
       session_start(); 
       $_SESSION['noti_two'] = 'bla'; 
       header('location:/someplace'); 
      } else { 
       var_dump($stmt->errorInfo()); 
      } 

     } 
    } catch (PDOException $pe) { 
     echo "S"; 
     echo('Connection error, because: ' . $pe->getMessage()); 
    } 
} else { 
    header('location:/someplace'); 
} 
+0

Я все испортил. Что еще, кроме «PDOException», мне нужно изменить? Я действительно пробовал все это в PDO тоже, и получил ту же проблему. –

+0

Обновите свой вопрос с помощью кода pdo, который мы будем сортировать – meda

+0

Предоставлен только код PDO. –