致命错误:在第16行非对象上调用成员函数prepare()


Fatal error: Call to a member function prepare() on a non-object on line 16

我在我的网站上有一个注册系统,我正在将我所有的mysql语句更改为PDO语句。当我改变它时,我得到了这个错误:致命错误:在第16行非对象上调用成员函数prepare()

这是我的代码…

<?php
include("sql.php");
    require("includes/password.php");
session_start(); //Start session for writing
$errmsg = array(); //Array to store errors
    $noterr = array();
$errflag = false; //Error flag
function UniqueID() {
$UID = rand(); //Create unique ID
$check = $db->prepare('SELECT * FROM `users` WHERE `UID` = :UID'); //line 16
    $UIDarray = array(
        UID => $UID
);
    $check->execute($UIDarray);

sql.php…

<?php
ob_start();
session_start();
//database credentials
$dbhost = 'dbhost';
$dbuser = 'dbuser';
$dbpass = 'dbpass';
$dbname = 'dbname';
$db = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

您的数据库连接- $db -超出范围。见http://www.php.net/manual/en/language.variables.scope.php

你需要添加它作为一个函数参数

function UniqueID($db) {
                  ^^^

和调用函数

UniqueID($db)

或者将include放入函数

function UniqueID() {
    include("sql.php");

或声明全局

function UniqueID() {
 global $db

Scope在PHP中不是全局的。您的$db->execute调用在UniqueID函数内,并且该函数无法访问sql.php中定义的$db变量。如果您更改UniqueId函数以接受数据库参数,然后将该参数传递给该函数,您将能够访问它。