【问题标题】:PDO OOP PHP - Undefined variable and non-objectPDO OOP PHP - 未定义的变量和非对象
【发布时间】:2016-09-02 13:27:27
【问题描述】:

这是一个PHP登录脚本这部分是注册部分。我编写了一个用户类,它控制的 $user->check() 函数是空的表单元素或不同的东西。但我是 PDO 和 OOP 的新手,我想我做错了什么,所以不幸的是它显示了两个错误..

其中一个是:

注意:未定义变量:C:\wamp\www\eva\userclass.php 第 56 行中的 DB_con

另一个是:

致命错误:在第 56 行对 C:\wamp\www\eva\userclass.php 中的非对象调用成员函数 prepare()

userclass.php 第 56 行:

$stmt = $DB_con->prepare("SELECT user_name,user_email FROM users WHERE user_name=:uname OR user_email=:umail");

我做错了什么?这是我所有的文件,谢谢。

dbconfig.php

<?php

session_start();

$DB_host = "localhost";
$DB_name = "dbeva";
$DB_user = "root";
$DB_pass = "";

try {

    $DB_con = new PDO("mysql:host={$DB_host};dbname={$DB_name}",$DB_user,$DB_pass);
    $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "<div class='bildirim'>- Veritabanına Bağlandı !</div>";

    }

catch(PDOException $e) {

    echo $e->getMessage();
    echo "<div class='bildirim'>- Veritabanı Bağlantısı Başarısız !</div>";

    }

include_once 'userclass.php';
$user = new user($DB_con);

?>

用户类.php

<?php

    class user {

        private $db;

        function __construct($DB_con) {

            $this->db = $DB_con;
            echo "<div class='bildirim'>- Constructor Çalıştı !</div>";

        }   // Constructor Function

        public function check($cuname,$cumail,$cupass) {

            if ($cuname == "") {

                echo "<div class='bildirim'>Kullanıcı adı boş bırakılamaz.</div>";

            }   // if $cuname == ""

            else if (strlen($cuname) < 6 && strlen($cuname) > 15) {

                echo "<div class='bildirim'>Kullanıcı adı 6 ile 15 karakter arasında olmalıdır.</div>";

            }   // else if 6 <= $cuname <= 15

            else if ($cumail == "") {

                echo "<div class='bildirim'>Email boş bırakılamaz.</div>";

            }   // else if $cumail == ""

            else if (!filter_var($cumail, FILTER_VALIDATE_EMAIL)) {

                echo "<div class='bildirim'>Lütfen geçerli bir mail adresi girin.</div>";

            }   // else if validate email

            else if ($cupass == "") {

                echo "<div class='bildirim'>Şifre boş bırakılamaz.</div>";

            }   //else if $cupass == ""

            else if (strlen($cupass) < 6) {

                echo "<div class='bildirim'>Şifre en az 6 karakter olmalıdır.</div>";

            }   // else if $upass < 6

            else {

                try {

                    $stmt = $DB_con->prepare("SELECT user_name,user_email FROM users WHERE user_name=:uname OR user_email=:umail");
                    $stmt->execute(array(':uname'=>$cuname, ':umail'=>$cumail));
                    $row = $stmt->fetch(PDO::FETCH_ASSOC);

                    if($row['user_name'] == $cuname) {

                        echo "<div class='bildirim'>Üzgünüz, kullanıcı adı çoktan alınmış.</div>";

                    }   // if user_name exist

                    else if($row['user_email'] == $cumail) {

                        echo "<div class='bildirim'>Üzgünüz, sitemizde bu mail adresi ile kayıtlı bir üye zaten var.</div>";

                    }   // else if user_email exist

                    else {

                        try {

                            $new_pass = password_hash($cupass, PASSWORD_DEFAULT);

                            $stmt = $this->db->prepare("INSERT INTO users(user_name,user_email,user_pass)
                                                        VALUES(:uname,:umail,:upass)");

                            $stmt->bindparam(":uname", $cuname);
                            $stmt->bindparam(":umail", $cumail);
                            $stmt->bindparam(":upass", $new_pass);
                            $stmt->execute();
                            return $stmt;

                            echo "<div class='bildirim'>- Kayıt İşlemi Başarılı !</div>";

                        }   // try register

                        catch(PDOException $e) {

                            echo $e->getMessage();
                            echo "<div class='bildirim'>- Kayıt İşlemi Başarısız !</div>";

                        }   // catch register

                    }   // else

                }   // try check

                catch (PDOException $e) {

                    echo $e->getMessage();

                }   // catch check

            }   // else

        }   // Function Check

    }   // User Class

?>

index.php

<?php

    require_once "dbconfig.php";

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

        $r_uname = trim($_POST['r_uname']);
        $r_uname = strip_tags($r_uname);
        $r_umail = trim($_POST['r_umail']);
        $r_umail = strip_tags($r_umail);
        $r_upass = trim($_POST['r_upass']);
        $r_upass = strip_tags($r_upass);

        $user->check($r_uname,$r_umail,$r_upass);

    }   // if isset btn_signup

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

        //$user->login();

    }   // if isset btn_signup

?>

<html>
<head>
    <head>
    <title>Eva Login System</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="style.css"/>
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:' rel='stylesheet' type='text/css'>
</head>
</head>
<body>
    <div class="formwrapper">
        <h2>Giriş Yap !</h2>
        <form method="post" action="">
            <input class="inputa" type="text" name="l_umail" placeholder="Email">
            <input class="inputa" type="password" name="l_upass" placeholder="Şifre">
            <input class="inputb" type="submit" name="btn_login" value="Giriş Yap">
        </form>
    </div>
    <div class="formwrapper">
        <h2>Bize Katıl !</h2>
        <form method="post" action="">
            <input class="inputa" type="text" name="r_uname" placeholder="Kullanıcı Adı">
            <input class="inputa" type="text" name="r_umail" placeholder="Email">
            <input class="inputa" type="text" name="r_upass" placeholder="Şifre">
            <input class="inputb" type="submit" name="btn_signup" value="Hesap Aç">
        </form>
    </div>
</body>
</html>

【问题讨论】:

    标签: php mysql oop pdo


    【解决方案1】:

    在文件C:\wamp\www\eva\userclass.php 中将$DB_con 替换为$this-&gt;db,(第56 行)。

    【讨论】:

    • 实际上 DB_con 被传递给类的构造函数并分配给私有变量,因此除非与 DB 的连接出现错误,否则我的建议将起作用
    • @PeterDarmis 在这种情况下,如果是你的,请删除反对票
    • 它有效,谢谢。我投票给你的答案,但我有另一个问题它是如此简单但不起作用。为什么这里不工作? else if (strlen($cuname) &lt; 6 &amp;&amp; strlen($cuname) &gt; 15) { echo "&lt;div class='bildirim'&gt;Kullanıcı adı 6 ile 15 karakter arasında olmalıdır.&lt;/div&gt;"; }
    • @RiggsFolly 我的建议是耐心等待,因为我们都犯过类似的错误
    • @Brown,您应该使用 OR 而不是 AND,因为字符串长度应小于 6 或大于 15 才能失败。 else if (strlen($cuname) 15) { echo "
      Kullanıcı adı 6 ile 15 karakter arasında olmalıdır.
      "; }
    【解决方案2】:

    修改课堂上的错误部分

     $stmt = $DB_con->prepare("SELECT user_name,user_email FROM users WHERE user_name=:uname OR user_email=:umail");
    

     $stmt = $this->db->prepare("SELECT user_name,user_email FROM users WHERE user_name=:uname OR user_email=:umail");
    

    完整课程

    class user {
    
            private $db;
    
            function __construct($DB_con) {
    
                $this->db = $DB_con;
                echo "<div class='bildirim'>- Constructor Çalıştı !</div>";
    
            }   // Constructor Function
    
            public function check($cuname,$cumail,$cupass) {
                $error = false;
                if (empty($cuname)) {
    
                    echo "<div class='bildirim'>Kullanıcı adı boş bırakılamaz.</div>";
                    $error = true;
    
                }
    
                if (strlen($cuname) < 6 || strlen($cuname) > 15) {
    
                    echo "<div class='bildirim'>Kullanıcı adı 6 ile 15 karakter arasında olmalıdır.</div>";
                    $error = true;
                } 
    
                if (empty($cumail)) {
    
                    echo "<div class='bildirim'>Email boş bırakılamaz.</div>";
                    $error = true;
                } 
    
                if (!filter_var($cumail, FILTER_VALIDATE_EMAIL)) {
    
                    echo "<div class='bildirim'>Lütfen geçerli bir mail adresi girin.</div>";
                    $error = true;
                } 
    
                if (empty($cupass)) {
    
                    echo "<div class='bildirim'>Şifre boş bırakılamaz.</div>";
                    $error = true;
                }
    
                if (strlen($cupass) < 6) {
    
                    echo "<div class='bildirim'>Şifre en az 6 karakter olmalıdır.</div>";
                    $error = true;
                } 
                if($error==false) {
                    try {
    
                        $stmt = $DB_con->prepare("SELECT user_name,user_email FROM users WHERE user_name=:uname OR user_email=:umail");
                        $stmt->execute(array(':uname'=>$cuname, ':umail'=>$cumail));
                        $row = $stmt->fetch(PDO::FETCH_ASSOC);
    
                        if($row['user_name'] == $cuname) {
    
                            echo "<div class='bildirim'>Üzgünüz, kullanıcı adı çoktan alınmış.</div>";
                            $error = true;
                        }   
    
                        if($row['user_email'] == $cumail) {
    
                            echo "<div class='bildirim'>Üzgünüz, sitemizde bu mail adresi ile kayıtlı bir üye zaten var.</div>";
                            $error = true;
                        }  
                        if($error==false) {                 
                            try {
    
                                $new_pass = password_hash($cupass, PASSWORD_DEFAULT);
    
                                $stmt = $this->db->prepare("INSERT INTO users(user_name,user_email,user_pass)
                                                            VALUES(:uname,:umail,:upass)");
    
                                $stmt->bindparam(":uname", $cuname);
                                $stmt->bindparam(":umail", $cumail);
                                $stmt->bindparam(":upass", $new_pass);
                                $stmt->execute();
                                return $stmt;
    
                                echo "<div class='bildirim'>- Kayıt İşlemi Başarılı !</div>";
    
                            }   // try register
    
                            catch(PDOException $e) {
    
                                echo $e->getMessage();
                                echo "<div class='bildirim'>- Kayıt İşlemi Başarısız !</div>";
    
                            }   // catch register
                        }
    
                    }   // try check
    
                    catch (PDOException $e) {
    
                        echo $e->getMessage();
    
                    }   // catch check
    
                }
    
            }   // Function Check
    
        }   // User Class
    

    【讨论】:

    • 您稍后在您的插入语句中将其正确,但在选择时您使用 $DB_con 时应该使用 $this->db。
    • @RiggsFolly 完整解决方案不会在第 77 行抛出错误
    • @Brown Ummm less than 6 AND greater than 15 可能是什么值 ??????
    • @Brown 我已经对课程进行了一些更改,您可以检查一下吗?
    • @RiggsFolly 是对的,它是 less than 6greater than 15
    【解决方案3】:

    转到php.ini 文件并找到;extension=php_pdo_mysql.dll 语句。

    然后删除; 并保存文件。

    然后重新启动您的 Apache 服务器。

    【讨论】:

      猜你喜欢
      • 2019-09-18
      • 1970-01-01
      • 2015-11-17
      • 2016-04-07
      • 2015-10-13
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多