php - 在回调函数中看不到 PDO 连接对象

标签 php mysql pdo connection

我有一个带有index.php页面的登录项目,该页面根据index.php页面中所需的连接脚本connect.inc.php从另一个脚本文件core.inc.php调用登录函数 core.inc.php 无法看到连接对象抛出 undefined variable 错误.....为什么? 尝试通过 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 中看不到连接 $conn 对象抛出 getuserfield($field) 函数回调 这有什么问题吗? 请帮忙:)

最佳答案

$conn 对象在 getuserfield 函数中不可见,因为在函数内部默认情况下无法访问在外部定义的变量。您需要使用 global 关键字来访问该变量:

function getuserfield($field){
  global $conn;
  /* ... */
}

虽然这会解决你的问题,但我建议不要使用global,你的代码会变得困惑并且难以调试。一种更简洁的方法是创建一个处理数据库操作的类,在这个类中,您可以将连接存储在静态变量中:

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();

这样您就可以在任何地方访问连接对象,而无需使用 globalMyDB::$conn

关于php - 在回调函数中看不到 PDO 连接对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514049/

相关文章:

php - 法语编码字符

PHP PDO Mysql 插入失败,不抛出异常或错误

PHP Tidy 删除有效标签

php - wordpress中的index.php什么时候执行?

html - 如何自动将相同的自动递增 ID 存储在两个不同的表中?

mysql - AWS WordPress 高可用性 EFS、EC2 和 MySQL 数据库

mysql - 获取数据(如果数据可用或不可用)

php - 在 Laravel 中使用原始 json 队列消息

php - 解析csv文件php

mysql - 如何从我的 MySQL 表中删除约束?