Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 致命错误:无法重新声明已尝试的类类名错误require_once()_Php_Mysqli_Pdo - Fatal编程技术网

Php 致命错误:无法重新声明已尝试的类类名错误require_once()

Php 致命错误:无法重新声明已尝试的类类名错误require_once(),php,mysqli,pdo,Php,Mysqli,Pdo,我来自Java编程,我试图将我的知识应用于PHP中的OOP风格编程 所以,我尝试创建一个连接到数据库的实用程序类,就像我在Java中通常做的那样,在Java中我创建一个静态方法来获得数据库连接 然而,花了几个小时后,我仍然无法修复错误 DBHelper.php <?php class DBHelper { protected $db_name = 'myDb'; protected $db_user = 'root'; protected $db_pass = '

我来自Java编程,我试图将我的知识应用于PHP中的OOP风格编程

所以,我尝试创建一个连接到数据库的实用程序类,就像我在Java中通常做的那样,在Java中我创建一个静态方法来获得数据库连接

然而,花了几个小时后,我仍然无法修复错误

DBHelper.php

<?php

class DBHelper
{
    protected $db_name = 'myDb';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_host = 'localhost';

    public function obtainConnection()
    {

        $mysqli_instance = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
        return $mysqli_instance;
    }
}
?>
<?php
if (isset($_POST['submit'])) {
    include "/DBUtility/DBHelper.php";
    $username = $_POST['username']; //s means string
    $password = $_POST['password']; // s means string
    echo "<br/> Username value: " . $username;
    echo "<br />Password value: " . $password;
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {

    //PREPARE THE PreparedStatment or Stored Procedure


    $dbHelper = new DBHelper();
    $connection = $dbHelper->obtainConnection();
    $preparedStatement = $connection->prepare('CALL getUserRoleByLogin(?, ?)'); //getUserRoleByLogin() is the name of stored proc in mysql db
    $preparedStatement->bind_param('ss', $username, $password); //assign arguments to ? ?
    $preparedStatement->execute();//execute the stored procedure. This will return a result

    $userRole = $preparedStatement->store_result();
    $countOfRows = $preparedStatement->num_rows;

?>
# You can create a series of defines including the database
define('DB_HOST','localhost');
define('DB_NAME','dbname');
define('DB_USER','root');
define('DB_PASS','dbpassword');
# To maximize compatibility it's helpful to define fwd/back slash
define('DS',DIRECTORY_SEPARATOR);
# It is helpful to create path defines for easy file inclusion
define('ROOT_DIR',__DIR__);
define('CLASSES',ROOT_DIR.DS.'classes');

# Start session
session_start();
<?php
namespace DBUtility;

class DBHelper
{
    protected $query;
    private static $con;

    public function connection()
    {
        # This will send back the connection without making a new one
        if(self::$con instanceof \PDO)
            return self::$con;
        # I like to catch any pdo exceptions on connection, just incase.
        try {
            # Assign the connection
            self::$con = new \PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASS);
        }
        catch(\PDOException $e) {
            # Here you can just die with a more user-friendly error.
            # It would be helpful to save the actual error to a log file
            $msg = $e->getMessage();
            # I would put your log outside the root or in a protected folder
            $txt = realpath(ROOT_DIR.DS.'..').DS.'errors'.DS.'sql.txt';
            # Make a directory if none set
            if(!is_dir(pathinfo($txt,PATHINFO_DIRNAME))) {
                # Make the directory
                if(mkdir(pathinfo($txt,PATHINFO_DIRNAME),0744,true)) {
                    # Save to log file
                    file_put_contents($txt,$msg.PHP_EOL);
                }
            }
            else {
                # Save to log file
                file_put_contents($txt,$msg.PHP_EOL);
            }

            die("Site is under maintenance.");
        }
    }
    # It would be helpful to create a query that will bind and not bind
    public function query($sql,$bind = false)
        {
            if(is_array($bind)) {
                foreach($bind as $key => $value) {
                    $sKey = ":{$key}";
                    $bindArr[$sKey] = $value;
                }

                $this->query = $this->connection()->prepare($sql);
                $this->query->execute($bindArr);
            }
            else {
                # The second "query" on this is the method from PDO, not the
                # "query" method from this class
                $this->query = $this->connection()->query($sql);
            }

            return $this;
        }

    public function getResults()
        {
            if(empty($this->query))
                return false;

            while($result = $this->query->fetch(\PDO::FETCH_ASSOC)) {
                $row[] = $result;
            }

            return (isset($row))? $row : false;
        }
}
# If your page ends with a php tag, you should just remove it. It will
# protect against empty spaces that may cause "header already sent" errors
class Helper
    {
        public static function autoload($function)
            {
                if(function_exists($function))
                    return;

                $path = ROOT_DIR.DS.'functions'.DS.$function.'.php';
                if(is_file($path))
                    include_once($path);
            }
    }
function getUserRole($username,$password,\DBUtility\DBHelper $DBHelper)
    {
        return $DBHelper->query('CALL getUserRoleByLogin(:0, :1)',array($username,$password))->getResults();
    }
# Include the config file
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');

if (isset($_POST['submit'])) {
    # No need for this line ->> include "/DBUtility/DBHelper.php";
    # Use trim to remove empty spaces on the left and right
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {
    # User our function autoloader to include this function
    Helper::autoload('getUserRole');
    # Use the function and inject the DB class
    $userRoles = getUserRole($username,$password,new \DBUtility\DBHelper());
    $count     = count($userRoles);

    echo "Count: {$count}";
    echo '<pre>';
    print_r($userRoles);
    echo '</pre>';
}
我阅读了所有关于
致命错误:无法重新声明类CLASSNAME
错误的相关问题。我试着按照许多人给出的指令使用
require_once(“DBHelper.php”)
而不是
include(“DBHelper.php”)
但仍然无法摆脱错误

我尝试将
obtainConnection()
设置为静态,并通过
DBHelper::obtainConnection()调用它但是没有运气。相同的错误消息

我在打开
类DBHelper的大括号时出错
{

我希望你能帮我做这件事


谢谢。

在PHP中执行OOP时,应注意以下几点:

1) 我可能会重新考虑不直接将db凭据烘焙到类中,如果您想实现一个UI控制机制,那么通过UI修改它们会变得更困难/更麻烦。相反,尝试创建一个或可能是一个
json
pref文件,或是一个动态创建的
php
文件,其中包含一个数组,等等诸如此类。我将做一个定义,因为它最容易演示:

/config.php

<?php

class DBHelper
{
    protected $db_name = 'myDb';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_host = 'localhost';

    public function obtainConnection()
    {

        $mysqli_instance = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
        return $mysqli_instance;
    }
}
?>
<?php
if (isset($_POST['submit'])) {
    include "/DBUtility/DBHelper.php";
    $username = $_POST['username']; //s means string
    $password = $_POST['password']; // s means string
    echo "<br/> Username value: " . $username;
    echo "<br />Password value: " . $password;
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {

    //PREPARE THE PreparedStatment or Stored Procedure


    $dbHelper = new DBHelper();
    $connection = $dbHelper->obtainConnection();
    $preparedStatement = $connection->prepare('CALL getUserRoleByLogin(?, ?)'); //getUserRoleByLogin() is the name of stored proc in mysql db
    $preparedStatement->bind_param('ss', $username, $password); //assign arguments to ? ?
    $preparedStatement->execute();//execute the stored procedure. This will return a result

    $userRole = $preparedStatement->store_result();
    $countOfRows = $preparedStatement->num_rows;

?>
# You can create a series of defines including the database
define('DB_HOST','localhost');
define('DB_NAME','dbname');
define('DB_USER','root');
define('DB_PASS','dbpassword');
# To maximize compatibility it's helpful to define fwd/back slash
define('DS',DIRECTORY_SEPARATOR);
# It is helpful to create path defines for easy file inclusion
define('ROOT_DIR',__DIR__);
define('CLASSES',ROOT_DIR.DS.'classes');

# Start session
session_start();
<?php
namespace DBUtility;

class DBHelper
{
    protected $query;
    private static $con;

    public function connection()
    {
        # This will send back the connection without making a new one
        if(self::$con instanceof \PDO)
            return self::$con;
        # I like to catch any pdo exceptions on connection, just incase.
        try {
            # Assign the connection
            self::$con = new \PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASS);
        }
        catch(\PDOException $e) {
            # Here you can just die with a more user-friendly error.
            # It would be helpful to save the actual error to a log file
            $msg = $e->getMessage();
            # I would put your log outside the root or in a protected folder
            $txt = realpath(ROOT_DIR.DS.'..').DS.'errors'.DS.'sql.txt';
            # Make a directory if none set
            if(!is_dir(pathinfo($txt,PATHINFO_DIRNAME))) {
                # Make the directory
                if(mkdir(pathinfo($txt,PATHINFO_DIRNAME),0744,true)) {
                    # Save to log file
                    file_put_contents($txt,$msg.PHP_EOL);
                }
            }
            else {
                # Save to log file
                file_put_contents($txt,$msg.PHP_EOL);
            }

            die("Site is under maintenance.");
        }
    }
    # It would be helpful to create a query that will bind and not bind
    public function query($sql,$bind = false)
        {
            if(is_array($bind)) {
                foreach($bind as $key => $value) {
                    $sKey = ":{$key}";
                    $bindArr[$sKey] = $value;
                }

                $this->query = $this->connection()->prepare($sql);
                $this->query->execute($bindArr);
            }
            else {
                # The second "query" on this is the method from PDO, not the
                # "query" method from this class
                $this->query = $this->connection()->query($sql);
            }

            return $this;
        }

    public function getResults()
        {
            if(empty($this->query))
                return false;

            while($result = $this->query->fetch(\PDO::FETCH_ASSOC)) {
                $row[] = $result;
            }

            return (isset($row))? $row : false;
        }
}
# If your page ends with a php tag, you should just remove it. It will
# protect against empty spaces that may cause "header already sent" errors
class Helper
    {
        public static function autoload($function)
            {
                if(function_exists($function))
                    return;

                $path = ROOT_DIR.DS.'functions'.DS.$function.'.php';
                if(is_file($path))
                    include_once($path);
            }
    }
function getUserRole($username,$password,\DBUtility\DBHelper $DBHelper)
    {
        return $DBHelper->query('CALL getUserRoleByLogin(:0, :1)',array($username,$password))->getResults();
    }
# Include the config file
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');

if (isset($_POST['submit'])) {
    # No need for this line ->> include "/DBUtility/DBHelper.php";
    # Use trim to remove empty spaces on the left and right
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {
    # User our function autoloader to include this function
    Helper::autoload('getUserRole');
    # Use the function and inject the DB class
    $userRoles = getUserRole($username,$password,new \DBUtility\DBHelper());
    $count     = count($userRoles);

    echo "Count: {$count}";
    echo '<pre>';
    print_r($userRoles);
    echo '</pre>';
}
2) 在
config.php
文件中创建一个类,这样您就不必在页面中手动包含/要求类。它将自动包含它们:

spl_autoload_register(function($class) {
    if(class_exists($class))
        return;

    # This will turn a namespace/class into a path so should turn:
    # $db = new \DBUtility\DBHelper();
    # into:
    # /var/www/domain/httpdocs/classes/DBUtility/DBHelper.php
    $path = str_replace(DS.DS,DS,CLASSES.DS.str_replace('\\',DS,$class).'.php');
    # If the class file is located in the class folder, it will include it
    if(is_file($path))
        include_once($path);
});
3) 我将创建一个静态连接,这样您就不会每次都创建一个新连接(我也将使用):

/classes/DBUtility/DBHelper.php

<?php

class DBHelper
{
    protected $db_name = 'myDb';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_host = 'localhost';

    public function obtainConnection()
    {

        $mysqli_instance = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
        return $mysqli_instance;
    }
}
?>
<?php
if (isset($_POST['submit'])) {
    include "/DBUtility/DBHelper.php";
    $username = $_POST['username']; //s means string
    $password = $_POST['password']; // s means string
    echo "<br/> Username value: " . $username;
    echo "<br />Password value: " . $password;
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {

    //PREPARE THE PreparedStatment or Stored Procedure


    $dbHelper = new DBHelper();
    $connection = $dbHelper->obtainConnection();
    $preparedStatement = $connection->prepare('CALL getUserRoleByLogin(?, ?)'); //getUserRoleByLogin() is the name of stored proc in mysql db
    $preparedStatement->bind_param('ss', $username, $password); //assign arguments to ? ?
    $preparedStatement->execute();//execute the stored procedure. This will return a result

    $userRole = $preparedStatement->store_result();
    $countOfRows = $preparedStatement->num_rows;

?>
# You can create a series of defines including the database
define('DB_HOST','localhost');
define('DB_NAME','dbname');
define('DB_USER','root');
define('DB_PASS','dbpassword');
# To maximize compatibility it's helpful to define fwd/back slash
define('DS',DIRECTORY_SEPARATOR);
# It is helpful to create path defines for easy file inclusion
define('ROOT_DIR',__DIR__);
define('CLASSES',ROOT_DIR.DS.'classes');

# Start session
session_start();
<?php
namespace DBUtility;

class DBHelper
{
    protected $query;
    private static $con;

    public function connection()
    {
        # This will send back the connection without making a new one
        if(self::$con instanceof \PDO)
            return self::$con;
        # I like to catch any pdo exceptions on connection, just incase.
        try {
            # Assign the connection
            self::$con = new \PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASS);
        }
        catch(\PDOException $e) {
            # Here you can just die with a more user-friendly error.
            # It would be helpful to save the actual error to a log file
            $msg = $e->getMessage();
            # I would put your log outside the root or in a protected folder
            $txt = realpath(ROOT_DIR.DS.'..').DS.'errors'.DS.'sql.txt';
            # Make a directory if none set
            if(!is_dir(pathinfo($txt,PATHINFO_DIRNAME))) {
                # Make the directory
                if(mkdir(pathinfo($txt,PATHINFO_DIRNAME),0744,true)) {
                    # Save to log file
                    file_put_contents($txt,$msg.PHP_EOL);
                }
            }
            else {
                # Save to log file
                file_put_contents($txt,$msg.PHP_EOL);
            }

            die("Site is under maintenance.");
        }
    }
    # It would be helpful to create a query that will bind and not bind
    public function query($sql,$bind = false)
        {
            if(is_array($bind)) {
                foreach($bind as $key => $value) {
                    $sKey = ":{$key}";
                    $bindArr[$sKey] = $value;
                }

                $this->query = $this->connection()->prepare($sql);
                $this->query->execute($bindArr);
            }
            else {
                # The second "query" on this is the method from PDO, not the
                # "query" method from this class
                $this->query = $this->connection()->query($sql);
            }

            return $this;
        }

    public function getResults()
        {
            if(empty($this->query))
                return false;

            while($result = $this->query->fetch(\PDO::FETCH_ASSOC)) {
                $row[] = $result;
            }

            return (isset($row))? $row : false;
        }
}
# If your page ends with a php tag, you should just remove it. It will
# protect against empty spaces that may cause "header already sent" errors
class Helper
    {
        public static function autoload($function)
            {
                if(function_exists($function))
                    return;

                $path = ROOT_DIR.DS.'functions'.DS.$function.'.php';
                if(is_file($path))
                    include_once($path);
            }
    }
function getUserRole($username,$password,\DBUtility\DBHelper $DBHelper)
    {
        return $DBHelper->query('CALL getUserRoleByLogin(:0, :1)',array($username,$password))->getResults();
    }
# Include the config file
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');

if (isset($_POST['submit'])) {
    # No need for this line ->> include "/DBUtility/DBHelper.php";
    # Use trim to remove empty spaces on the left and right
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {
    # User our function autoloader to include this function
    Helper::autoload('getUserRole');
    # Use the function and inject the DB class
    $userRoles = getUserRole($username,$password,new \DBUtility\DBHelper());
    $count     = count($userRoles);

    echo "Count: {$count}";
    echo '<pre>';
    print_r($userRoles);
    echo '</pre>';
}
4) 创建有用的/可重用的函数或类/方法

/functions/getUserRole.php

<?php

class DBHelper
{
    protected $db_name = 'myDb';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_host = 'localhost';

    public function obtainConnection()
    {

        $mysqli_instance = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
        return $mysqli_instance;
    }
}
?>
<?php
if (isset($_POST['submit'])) {
    include "/DBUtility/DBHelper.php";
    $username = $_POST['username']; //s means string
    $password = $_POST['password']; // s means string
    echo "<br/> Username value: " . $username;
    echo "<br />Password value: " . $password;
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {

    //PREPARE THE PreparedStatment or Stored Procedure


    $dbHelper = new DBHelper();
    $connection = $dbHelper->obtainConnection();
    $preparedStatement = $connection->prepare('CALL getUserRoleByLogin(?, ?)'); //getUserRoleByLogin() is the name of stored proc in mysql db
    $preparedStatement->bind_param('ss', $username, $password); //assign arguments to ? ?
    $preparedStatement->execute();//execute the stored procedure. This will return a result

    $userRole = $preparedStatement->store_result();
    $countOfRows = $preparedStatement->num_rows;

?>
# You can create a series of defines including the database
define('DB_HOST','localhost');
define('DB_NAME','dbname');
define('DB_USER','root');
define('DB_PASS','dbpassword');
# To maximize compatibility it's helpful to define fwd/back slash
define('DS',DIRECTORY_SEPARATOR);
# It is helpful to create path defines for easy file inclusion
define('ROOT_DIR',__DIR__);
define('CLASSES',ROOT_DIR.DS.'classes');

# Start session
session_start();
<?php
namespace DBUtility;

class DBHelper
{
    protected $query;
    private static $con;

    public function connection()
    {
        # This will send back the connection without making a new one
        if(self::$con instanceof \PDO)
            return self::$con;
        # I like to catch any pdo exceptions on connection, just incase.
        try {
            # Assign the connection
            self::$con = new \PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASS);
        }
        catch(\PDOException $e) {
            # Here you can just die with a more user-friendly error.
            # It would be helpful to save the actual error to a log file
            $msg = $e->getMessage();
            # I would put your log outside the root or in a protected folder
            $txt = realpath(ROOT_DIR.DS.'..').DS.'errors'.DS.'sql.txt';
            # Make a directory if none set
            if(!is_dir(pathinfo($txt,PATHINFO_DIRNAME))) {
                # Make the directory
                if(mkdir(pathinfo($txt,PATHINFO_DIRNAME),0744,true)) {
                    # Save to log file
                    file_put_contents($txt,$msg.PHP_EOL);
                }
            }
            else {
                # Save to log file
                file_put_contents($txt,$msg.PHP_EOL);
            }

            die("Site is under maintenance.");
        }
    }
    # It would be helpful to create a query that will bind and not bind
    public function query($sql,$bind = false)
        {
            if(is_array($bind)) {
                foreach($bind as $key => $value) {
                    $sKey = ":{$key}";
                    $bindArr[$sKey] = $value;
                }

                $this->query = $this->connection()->prepare($sql);
                $this->query->execute($bindArr);
            }
            else {
                # The second "query" on this is the method from PDO, not the
                # "query" method from this class
                $this->query = $this->connection()->query($sql);
            }

            return $this;
        }

    public function getResults()
        {
            if(empty($this->query))
                return false;

            while($result = $this->query->fetch(\PDO::FETCH_ASSOC)) {
                $row[] = $result;
            }

            return (isset($row))? $row : false;
        }
}
# If your page ends with a php tag, you should just remove it. It will
# protect against empty spaces that may cause "header already sent" errors
class Helper
    {
        public static function autoload($function)
            {
                if(function_exists($function))
                    return;

                $path = ROOT_DIR.DS.'functions'.DS.$function.'.php';
                if(is_file($path))
                    include_once($path);
            }
    }
function getUserRole($username,$password,\DBUtility\DBHelper $DBHelper)
    {
        return $DBHelper->query('CALL getUserRoleByLogin(:0, :1)',array($username,$password))->getResults();
    }
# Include the config file
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');

if (isset($_POST['submit'])) {
    # No need for this line ->> include "/DBUtility/DBHelper.php";
    # Use trim to remove empty spaces on the left and right
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {
    # User our function autoloader to include this function
    Helper::autoload('getUserRole');
    # Use the function and inject the DB class
    $userRoles = getUserRole($username,$password,new \DBUtility\DBHelper());
    $count     = count($userRoles);

    echo "Count: {$count}";
    echo '<pre>';
    print_r($userRoles);
    echo '</pre>';
}
/index.php

<?php

class DBHelper
{
    protected $db_name = 'myDb';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_host = 'localhost';

    public function obtainConnection()
    {

        $mysqli_instance = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
        return $mysqli_instance;
    }
}
?>
<?php
if (isset($_POST['submit'])) {
    include "/DBUtility/DBHelper.php";
    $username = $_POST['username']; //s means string
    $password = $_POST['password']; // s means string
    echo "<br/> Username value: " . $username;
    echo "<br />Password value: " . $password;
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {

    //PREPARE THE PreparedStatment or Stored Procedure


    $dbHelper = new DBHelper();
    $connection = $dbHelper->obtainConnection();
    $preparedStatement = $connection->prepare('CALL getUserRoleByLogin(?, ?)'); //getUserRoleByLogin() is the name of stored proc in mysql db
    $preparedStatement->bind_param('ss', $username, $password); //assign arguments to ? ?
    $preparedStatement->execute();//execute the stored procedure. This will return a result

    $userRole = $preparedStatement->store_result();
    $countOfRows = $preparedStatement->num_rows;

?>
# You can create a series of defines including the database
define('DB_HOST','localhost');
define('DB_NAME','dbname');
define('DB_USER','root');
define('DB_PASS','dbpassword');
# To maximize compatibility it's helpful to define fwd/back slash
define('DS',DIRECTORY_SEPARATOR);
# It is helpful to create path defines for easy file inclusion
define('ROOT_DIR',__DIR__);
define('CLASSES',ROOT_DIR.DS.'classes');

# Start session
session_start();
<?php
namespace DBUtility;

class DBHelper
{
    protected $query;
    private static $con;

    public function connection()
    {
        # This will send back the connection without making a new one
        if(self::$con instanceof \PDO)
            return self::$con;
        # I like to catch any pdo exceptions on connection, just incase.
        try {
            # Assign the connection
            self::$con = new \PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASS);
        }
        catch(\PDOException $e) {
            # Here you can just die with a more user-friendly error.
            # It would be helpful to save the actual error to a log file
            $msg = $e->getMessage();
            # I would put your log outside the root or in a protected folder
            $txt = realpath(ROOT_DIR.DS.'..').DS.'errors'.DS.'sql.txt';
            # Make a directory if none set
            if(!is_dir(pathinfo($txt,PATHINFO_DIRNAME))) {
                # Make the directory
                if(mkdir(pathinfo($txt,PATHINFO_DIRNAME),0744,true)) {
                    # Save to log file
                    file_put_contents($txt,$msg.PHP_EOL);
                }
            }
            else {
                # Save to log file
                file_put_contents($txt,$msg.PHP_EOL);
            }

            die("Site is under maintenance.");
        }
    }
    # It would be helpful to create a query that will bind and not bind
    public function query($sql,$bind = false)
        {
            if(is_array($bind)) {
                foreach($bind as $key => $value) {
                    $sKey = ":{$key}";
                    $bindArr[$sKey] = $value;
                }

                $this->query = $this->connection()->prepare($sql);
                $this->query->execute($bindArr);
            }
            else {
                # The second "query" on this is the method from PDO, not the
                # "query" method from this class
                $this->query = $this->connection()->query($sql);
            }

            return $this;
        }

    public function getResults()
        {
            if(empty($this->query))
                return false;

            while($result = $this->query->fetch(\PDO::FETCH_ASSOC)) {
                $row[] = $result;
            }

            return (isset($row))? $row : false;
        }
}
# If your page ends with a php tag, you should just remove it. It will
# protect against empty spaces that may cause "header already sent" errors
class Helper
    {
        public static function autoload($function)
            {
                if(function_exists($function))
                    return;

                $path = ROOT_DIR.DS.'functions'.DS.$function.'.php';
                if(is_file($path))
                    include_once($path);
            }
    }
function getUserRole($username,$password,\DBUtility\DBHelper $DBHelper)
    {
        return $DBHelper->query('CALL getUserRoleByLogin(:0, :1)',array($username,$password))->getResults();
    }
# Include the config file
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');

if (isset($_POST['submit'])) {
    # No need for this line ->> include "/DBUtility/DBHelper.php";
    # Use trim to remove empty spaces on the left and right
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
}

if (empty($username) || empty($password) ) {
    echo "Fill out the fields!";
} else {
    # User our function autoloader to include this function
    Helper::autoload('getUserRole');
    # Use the function and inject the DB class
    $userRoles = getUserRole($username,$password,new \DBUtility\DBHelper());
    $count     = count($userRoles);

    echo "Count: {$count}";
    echo '<pre>';
    print_r($userRoles);
    echo '</pre>';
}
#包括配置文件
需要一次(uuu DIR_uu.DIRECTORY_useparator.config.php');
如果(isset($_POST['submit'])){
#不需要这行->>包括“/DBUtility/DBHelper.php”;
#使用“修剪”删除左右两侧的空白
$username=trim($_POST['username']);
$password=trim($_POST['password']);
}
if(空($username)| |空($password)){
echo“填写字段!”;
}否则{
#使用我们的函数autoloader包含此函数
Helper::autoload('getUserRole');
#使用函数并注入DB类
$userRoles=getUserRole($username,$password,new\DBUtility\DBHelper());
$count=count($userRoles);
echo“Count:{$Count}”;
回声';
打印(用户角色);
回声';
}

好吧,你做
require\u once
include\u once
是对的。它说你不能重新声明“DBHelper”吗或者类名是什么?@Rasclatt首先,谢谢。是的,我收到错误致命错误:无法重新声明类DbHelper其他原因可能是1)您使用的名称与已在其他地方创建的类相同(可能是由其他人创建的),在这种情况下,您应该使用名称空间2)也许您复制了此文件以便重命名和扩展它,但忘记了更改重复文件上的类名。此外,如果您只是在使用PHP new,我建议使用
PDO
而不是
mysqli_uu
,尽管这是个人偏好,但我认为您会发现它更简单绑定值,一般来说更简单。您可以将数组直接放入
execute()
中,如
$preparedStatement->execute(数组(“:0”=>$username,:1”=>$password))
我发现PDO更容易自动化和使用,但正如我所说,这是个人的偏好。感谢所有的提示。所有这些都将在未来有用,因为我将继续学习PHP中的OOP编程方式。你实际上是对的,我必须使用名称空间和require_一起修复错误。我将研究示例y你已经给出了。大多数OOP模式和风格与我在Java中的做法相似。我只需要学习一些关键字和命令。再次感谢。我的问题通过使用名称空间得到了解决。希望其中一些内容有帮助,我添加了一些额外的内容,我注意到我没有很好地解决一些问题,或者在某些情况下根本没有解决干杯