【问题标题】:PDO prepare statement doesn't substitute placeholders with dataPDO 准备语句不会用数据替换占位符
【发布时间】:2016-12-23 18:29:13
【问题描述】:

我正在使用 PDO 制作一些基本的登录注册表单,但是当我 var_dump() $query 时无法在数据库中插入数据,我看到没有值不会在 $query->execute 语句中执行。请参阅下面的内容当我发现 var_dump($query);

**

object(PDOStatement)#4 (1) { ["queryString"]=> string(92) "INSERT INTO 用户(用户名,密码,姓名,电子邮件,网站)值(?,?,?,?,?)“} 注册成功,点此登录

**

我遇到了这个问题并尝试了我所知道的几乎所有东西。请查看代码帮助我找到问题。

数据库格式如 数据库名称:oopreg 表名:用户

id          int(11)       primary auto_increment
username    varchar(30)
password    varchar(30)
name        varchar(50) 
email       varchar(100)
website     varchar(100)

config.php

<?php
class databaseConnection{

    public function __construct(){
        GLOBAL $pdo;
        try{
    $pdo = new  PDO('mysql:host:localhost;dbname=oopreg','root','');
    echo "Connected";
        }catch(PDOException $e){

            echo "DataBase connection Error";

        } 
    }

}

functions.php

<?php

require 'config.php';

   class loginRegistration{

      function  __construct(){
        $database = new databaseConnection();
      } 
     public function registerUser($username,$password,$name,$email,$website){
        global $pdo;
        $query= $pdo->prepare("SELECT id FROM users WHERE username=? AND email=?");
        $query->execute(array($username,$email));
        $num= $query->rowCount();
        if($num==0){
          $query= $pdo->prepare("INSERT INTO users(username,password,name,email,website) VALUES
                 (?,?,?,?,?)");
          $query->execute(array($username,$password,$name,$email,$website));  
        var_dump($query);
         return true;

        }else{
             print "<span style='color:red'>Error...Username/Email alreay exists</span>";
        }
     }

   }


  ?>

register.php

<?php

require_once "functions.php";
$user= new loginRegistration();
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Registration Page</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="wrapper">
    <div class="header">
        <h3>PHP OOP Login Register System</h3>
    </div><!--End header Section-->
    <div class="mainmenu">
        <ul>
            <li><a href="index.php">Home</a></li>
            <li><a href="profile.php">Show Profile</a></li>
            <li><a href="changePassword.php">Change Password</a></li>
            <li><a href="logout.php">Logout</a></li>
            <li><a href="login.php">Login</a></li>
            <li><a href="register.php">Register</a></li>
        </ul>
    </div><!--End Manin menu section-->

    <div class="content">
        <h2>Register</h2>

    <p class="msg">

       <!--PHP area start--> 
        <?php 
        if ($_SERVER['REQUEST_METHOD']=='POST') {
            $username=$_POST['username'];
            $password=$_POST['password'];
            $name=$_POST['name'];
            $email=$_POST['email'];
            $website=$_POST['website'];

           if(empty($username) or empty($password) or empty($name) or empty($email) or empty($website)) {

                echo "<span style='color:red;'> Field must not be empty</span>";
           }else{
                 $password=md5($password);
               $register=$user->registerUser($username,$password,$name,$email,$website);
               if($register){
                echo "<span style='color:green'>Registration successfull.<a href='login.php'>Click here</a> for login</span>";
               }else{
                echo "<span style='color:red'>UserName or email already exists</span>";
               }
           }

        }
         ?>
      </p>
    <div class="login_reg">
        <form action="" method="post"> 
            <table>
                <tr>
                    <td>Username:</td>
                    <td><input type="text" name="username" placeholder="Enter your username..."/></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td><input type="password" name="password" placeholder="Enter your password..."/></td>
                </tr>
                <tr>
                    <td>Name:</td>
                    <td><input type="text" name="name" placeholder="Enter your name..."/></td>
                </tr>
                <tr>
                    <td>Email:</td>
                    <td><input type="email" name="email" placeholder="Enter your email..."/></td>
                </tr>
                <tr>
                    <td>Website:</td>
                    <td><input type="text" name="website" placeholder="Enter your website..."/></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <input type="reset" name="" value="Reset"/>
                        <input type="submit" name="register" value="Register"/>

                    </td>
                </tr>
            </table>
        </form>
        <?php //var_dump($_POST); ?>
    </div><!--End Login_reg page-->
    <div class="back">
        <a href="">Back</a>

    </div>
    </div><!--End Content section-->
    <div class="footer">
        <h3>Training with live project</h3>
    </div>

</div><!--End Wrapper section-->
</body>
</html>

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

我看到没有值不会在 $query->execute 语句中执行。请参阅下面我 var_dump($query); 时发现的内容;

没关系,PDO 就是这样工作的。它不会用queryString 属性中的实际数据替换问号。

要查看您的查询不起作用的真正原因是什么,您必须正确配置 PDO,如我的文章 PDO tutorial. Connecting. DSN 中所述:

public function __construct(){
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new  PDO('mysql:host:localhost;dbname=oopreg','root','', $opt);

之后,如果出现错误,将向您报告。

【讨论】:

    【解决方案2】:

    您尚未从查询中的值中删除单引号。 你可能用过 值(':aa',... 代替 值(:a,...

    希望这能解决问题。我也有类似的挑战

    【讨论】:

    • 虽然这对某些人来说可能是一个有用的提示,但我相信你误解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2012-12-14
    • 2017-01-05
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多