在php中两次调用相同的函数时出错
Posted
技术标签:
【中文标题】在php中两次调用相同的函数时出错【英文标题】:error in calling same function twice in php 【发布时间】:2015-11-22 07:12:15 【问题描述】:我有一个名为record_list()
的函数,它可以帮助我在每次刷新/访问页面时回显从数据库中提取的查询。我尝试通过回显两次来使用此功能,但不幸的是,脚本后我的所有 DOM 元素都被隐藏了,我无法在我的 html 中使用以下分区/列表。但是,如果我调用它,它可以正常工作,没有任何问题。
除了这个我得到这个错误:
致命错误:在非对象上调用成员函数 query()
record_list():
function record_list()
//include db configuration file
include_once("configuration.php");
try
//mysql query
$user_id = $_SESSION['user_id'];
$results = $mysqli->query("SELECT * FROM education_record WHERE user_id='$user_id' ");
//get all records from add_delete_record table
while($row = $results->fetch_assoc())
echo '<li class = "col-md-4 col-xs-12 records_display" id="item_'.$row["id"].'">';
echo '<div class="del_wrapper"><a href="#" class="del_btn" id="del-'.$row["id"].'">';
echo '<img src="../img/removeButtonIcon.svg" height ="20px" width ="20px" border="0" />';
echo '</a></div>';
echo '<div class="controls group_row">';
echo '<div class="controls group">';
echo '<input disabled type="text"class="group"style="width:175px" value ="'.$row["degree_name"].'"/>';
echo '<input disabled type="text"class="group"style="width:175px" value ="'.$row["institute"].'"/>';
echo '<input disabled type="text"class="group"style="width:175px" value ="'.$row["specialisation"].'"/>';
echo '<input disabled type="text"class="group"style="width:100px" value ="'.$row["date_of_passing"].'"/>';
echo '</div>';
echo '</div>';
echo '</li>';
catch (mysqli_sql_exception $e)
throw $e;
die();
$mysqli->close();
//close db connection
configuration.php:
<?php
$host = 'localhost';
$dbname = 'databasename';
$username = 'username';
$password = 'can-be-anything';
try
$mysqli = new mysqli($host, $username, $password, $dbname);
catch (mysqli_sql_exception $e)
throw $e;
die();
?>
请帮助我识别此错误。
【问题讨论】:
这是因为您必须使用include("configuration.php");
而不是include_once("configuration.php");
如果您使用include_once
,则只有当此配置文件的第一个实例包含在某个脚本中时,它才会起作用。
@Rasclatt 是对的。如果您将include
放在您的函数之外,这也更好。正如您所说的 include_ONCE,只有第一次可以正常工作。然后在第二次尝试时,它违反了 ONCE 并弄得一团糟。
【参考方案1】:
这是因为您必须使用include("configuration.php");
而不是include_once("configuration.php");
如果您使用include_once
,则只有当该配置文件的第一个实例包含在某个脚本中时,它才会起作用。
我建议创建一个类来包装您的连接,将其保存为单例状态,以便在脚本中的其他任何地方使用。这是一个简单的例子:
classes/class.DatabaseConfig.php
<?php
class DatabaseConfig
private static $singleton;
public function __construct()
if(empty(self::$singleton))
self::$singleton = $this;
return self::$singleton;
public function connect($host = "localhost", $username = "username", $password = "password", $database = "database")
// Create connection
try
$mysqli = new mysqli($host, $username, $password, $database);
return $mysqli;
catch (mysqli_sql_exception $e)
throw $e;
die();
classes/class.Db.php
<?php
class Db
private static $singleton;
public static function mysqli()
if(empty(self::$singleton))
$con = new DatabaseConfig();
self::$singleton = $con->connect();
return self::$singleton;
index.php
<?php
// Look into using spl_autoload_register() here
include_once("classes/class.DatabaseConfig.php");
include_once("classes/class.Db.php");
// This will work
$con = Db::mysqli();
function myQuery()
// This will also work, so long as you have included the class
// file once before this function (not necessarily in this function either)
// is called to use
$con = Db::mysqli();
【讨论】:
【参考方案2】:发生这种情况是因为您每次执行函数时都会关闭与$mysqli->close();
的连接,但正如@Rasclatt 建议的那样,您只使用include_once
指令打开连接一次。您可以将include_once
替换为include 或尝试@Rasclatt OOP 方法,但如果您由于某种原因不想深入OOP,我建议将连接操作与函数分开并将其作为参数传递给函数
include_once("configuration.php");
function record_list($mysqli)
try
//MySQL query
$user_id = $_SESSION['user_id'];
$results = $mysqli->query("SELECT * FROM education_record WHERE user_id='$user_id' ");
//get all records from add_delete_record table
while($row = $results->fetch_assoc())
echo '<li class = "col-md-4 col-xs-12 records_display" id="item_'.$row["id"].'">';
echo '<div class="del_wrapper"><a href="#" class="del_btn" id="del-'.$row["id"].'">';
echo '<img src="../img/removeButtonIcon.svg" height ="20px" width ="20px" border="0" />';
echo '</a></div>';
echo '<div class="controls group_row">';
echo '<div class="controls group">';
echo '<input disabled type="text"class="group"style="width:175px" value ="'.$row["degree_name"].'"/>';
echo '<input disabled type="text"class="group"style="width:175px" value ="'.$row["institute"].'"/>';
echo '<input disabled type="text"class="group"style="width:175px" value ="'.$row["specialisation"].'"/>';
echo '<input disabled type="text"class="group"style="width:100px" value ="'.$row["date_of_passing"].'"/>';
echo '</div>';
echo '</div>';
echo '</li>';
catch (mysqli_sql_exception $e)
throw $e;
die();
/// You may call here record_list($mysqli) function as many times as you wish
record_list($mysqli)
$mysqli->close();
//close db connection
【讨论】:
我试图这样做。将 include 语句从函数体中取出。但我得到同样的错误。定义一个需要相同配置文件的函数也会显示错误。 :(以上是关于在php中两次调用相同的函数时出错的主要内容,如果未能解决你的问题,请参考以下文章
VS Code 向我显示“加载工作区时出错:在工作区中两次找到模块“main.go””