这些mysqli准备好的陈述有什么问题?

时间:2015-12-23 14:54:26

标签: php mysql mysqli prepared-statement

我尝试使用PHP和Mysql数据库创建注册脚本。插入无法完成。如果我使用已经在数据库中的电子邮件ID注册,它工作正常。但是,脚本无法插入新条目。它正在返回&#bo;(假)'。 我尝试过使用PDO做同样的事情。插入无法完成。所以,我尝试了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');
    }
?>

修改

这是仅限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');
    }
?>

请忽略变量或表格名称。我在这里编辑了一些名字。

2 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分:0)

您在同一个脚本中混合使用PDO和mysqli驱动程序,这是不可能的。

请使用其中之一,但不能同时使用两者。

PDO是优先扩展名。

编辑:

在您的查询中:

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

NAMEmysql reserved keyword,您可以使用反引号来逃避它:

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

编辑:

更改

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

var_dump($statement->errorInfo());

编辑:

$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');
}