【问题标题】:What is wrong in these mysqli prepared statements?这些 mysqli 准备好的语句有什么问题?
【发布时间】:2015-12-23 14:54:25
【问题描述】:

我正在尝试使用 PHP 和 Mysql 数据库制作注册脚本。无法进行插入。如果我使用数据库中已经存在的电子邮件 ID 进行注册,则它可以正常工作。但是,该脚本无法插入新条目。它正在返回“布尔(假)”。 我已经尝试使用 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');
    }
?>

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

【问题讨论】:

  • ..你能提供错误信息吗? $dbh->error 的输出是什么?
  • 你应该告诉mysqli在出现问题时抛出异常:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

标签: php mysql mysqli prepared-statement


【解决方案1】:

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

请使用其中之一,但不要同时使用。

PDO 是首选扩展。


编辑:

在您的查询中:

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 (...)

编辑:

改变

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

【讨论】:

  • 我搞砸了。除了“PDOException”之外,我还需要更改什么?实际上,我也尝试过 PDO 中的所有内容,但遇到了同样的问题。
  • 使用 pdo only 代码更新您的问题,我们将对其进行整理
  • 我没有在我的真实代码中使用这个名字。我修改了名称仅用于发布。实际的表名是“user_names”。
  • 知道了。 '数组(3) { [0]=> 字符串(5) "00000" [1]=> NULL [2]=> NULL } '
  • @sofa_maniac 不要忘记$dbh-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 以便 PDO 向您报告错误,请在连接后立即查看我的代码
【解决方案2】:

我相信你的逻辑有误。 试试这段代码,看看你会得到什么......

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

【讨论】:

  • 相同。结果完全相同。
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2015-04-25
  • 2012-12-01
  • 2015-03-22
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多