在回调函数中看不到 PDO 连接对象
PDO connection object cannot be seen in a call back function
我有一个带有 index.php 页面的登录项目,它根据 connect.inc.php 中所需的连接脚本 connect.inc.php 从另一个脚本文件 core.inc.php 调用登录函数37=] 页
core.inc.php 看不到连接对象抛出未定义的变量错误..... 为什么?
试图通过 print_r() 测试 $conn 对象但没有工作并抛出未定义的 var 错误....
请帮忙
这是 index.php 代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Home page</title>
</head>
<?php
require("connect.inc.php");
require("core.inc.php");
if(loggedin()){
echo 'Welcome ' . getuserfield('fname').' ' .
getuserfield('surname') .' <a href="logout.php">Logout!</a>';
}
else {include("loginform.inc.php"); echo "<a href='register.php'> Register! </a>";}
?>
<body>
</body>
</html>
这里是 connect.inc.php 文件:
<?php
define("MYSQL_HOST", "mysql:host=localhost;dbname=a_database;charset=utf8");
define("MYSQL_USER", "root");
define("MYSQL_PASS", "123456");
try{
$conn = new PDO(MYSQL_HOST,MYSQL_USER,MYSQL_PASS);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
}
catch(PDOException $e){
echo $e-> getMessage();
}
?>
最后 core.inc.php 页:
<?php
// to create a login session
ob_start();
session_start();
// define variable to the login form
$current_file =$_SERVER['SCRIPT_NAME'];
//define the referer where the command comes from
if(isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])){
$http_referer= $_SERVER['HTTP_REFERER'];
}
//check if logged in or not
function loggedin(){
if(isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])){
return true;
}
else{return false;}
}
////////////////
function getuserfield($field){
$sql = "SELECT `$field` FROM `users_tb` WHERE `id`='" .$_SESSION['user_id']. "'";
echo "connection : " ; print_r($conn);
if(@$run = $conn->query($sql)){
echo "table connected";
if ($sql_result = $run->fetch(PDO::FETCH_ASSOC)){
echo $run_result[$field];
//return $sql_result[$field];
}
else {return "Unknown";}
}
}
?>
问题是在core.inc.file抛出getuserfield($field)函数回调中看不到连接$conn对象
那有什么问题吗?
请帮助:)
$conn
对象在 getuserfield
函数中不可见,因为在函数内部您无法访问默认定义在外部的变量。您需要使用 global
关键字使变量可访问:
function getuserfield($field){
global $conn;
/* ... */
}
虽然这会解决您的问题,但我建议不要使用 global
,您的代码会变得混乱且难以调试。一种更简洁的方法是创建一个 class 来处理您的数据库操作,并且在这个 class 中您可以将连接存储在一个静态变量中:
class MyDB {
public static $conn;
public static function connect() {
try{
self::$conn = new PDO(MYSQL_HOST,MYSQL_USER,MYSQL_PASS);
self::$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
self::$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
self::$conn->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
}
catch(PDOException $e){
echo $e->getMessage();
}
}
}
MyDB::connect();
这样你就可以在任何地方访问连接对象而无需使用 global
和 MyDB::$conn
我有一个带有 index.php 页面的登录项目,它根据 connect.inc.php 中所需的连接脚本 connect.inc.php 从另一个脚本文件 core.inc.php 调用登录函数37=] 页 core.inc.php 看不到连接对象抛出未定义的变量错误..... 为什么? 试图通过 print_r() 测试 $conn 对象但没有工作并抛出未定义的 var 错误.... 请帮忙 这是 index.php 代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Home page</title>
</head>
<?php
require("connect.inc.php");
require("core.inc.php");
if(loggedin()){
echo 'Welcome ' . getuserfield('fname').' ' .
getuserfield('surname') .' <a href="logout.php">Logout!</a>';
}
else {include("loginform.inc.php"); echo "<a href='register.php'> Register! </a>";}
?>
<body>
</body>
</html>
这里是 connect.inc.php 文件:
<?php
define("MYSQL_HOST", "mysql:host=localhost;dbname=a_database;charset=utf8");
define("MYSQL_USER", "root");
define("MYSQL_PASS", "123456");
try{
$conn = new PDO(MYSQL_HOST,MYSQL_USER,MYSQL_PASS);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
}
catch(PDOException $e){
echo $e-> getMessage();
}
?>
<?php
// to create a login session
ob_start();
session_start();
// define variable to the login form
$current_file =$_SERVER['SCRIPT_NAME'];
//define the referer where the command comes from
if(isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])){
$http_referer= $_SERVER['HTTP_REFERER'];
}
//check if logged in or not
function loggedin(){
if(isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])){
return true;
}
else{return false;}
}
////////////////
function getuserfield($field){
$sql = "SELECT `$field` FROM `users_tb` WHERE `id`='" .$_SESSION['user_id']. "'";
echo "connection : " ; print_r($conn);
if(@$run = $conn->query($sql)){
echo "table connected";
if ($sql_result = $run->fetch(PDO::FETCH_ASSOC)){
echo $run_result[$field];
//return $sql_result[$field];
}
else {return "Unknown";}
}
}
?>
问题是在core.inc.file抛出getuserfield($field)函数回调中看不到连接$conn对象 那有什么问题吗? 请帮助:)
$conn
对象在 getuserfield
函数中不可见,因为在函数内部您无法访问默认定义在外部的变量。您需要使用 global
关键字使变量可访问:
function getuserfield($field){
global $conn;
/* ... */
}
虽然这会解决您的问题,但我建议不要使用 global
,您的代码会变得混乱且难以调试。一种更简洁的方法是创建一个 class 来处理您的数据库操作,并且在这个 class 中您可以将连接存储在一个静态变量中:
class MyDB {
public static $conn;
public static function connect() {
try{
self::$conn = new PDO(MYSQL_HOST,MYSQL_USER,MYSQL_PASS);
self::$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
self::$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
self::$conn->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
}
catch(PDOException $e){
echo $e->getMessage();
}
}
}
MyDB::connect();
这样你就可以在任何地方访问连接对象而无需使用 global
和 MyDB::$conn