在php中两次调用相同的函数时出错

     2023-05-09     37

关键词:

【中文标题】在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-&gt;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 语句从函数体中取出。但我得到同样的错误。定义一个需要相同配置文件的函数也会显示错误。 :(

在选择查询中两次调用用户定义的函数会导致效率低下吗?

】在选择查询中两次调用用户定义的函数会导致效率低下吗?【英文标题】:Doescallingauserdefinedfunctiontwiceinselectqueryleadtoinefficiency?【发布时间】:2016-10-1007:14:18【问题描述】:我有一个简单的表格,用于存储人们的生日。我还有... 查看详情

VS Code 向我显示“加载工作区时出错:在工作区中两次找到模块“main.go””

】VSCode向我显示“加载工作区时出错:在工作区中两次找到模块“main.go””【英文标题】:VSCodeshowingme"Errorloadingworkspace:foundmodule"main.go"twiceintheworkspace"【发布时间】:2022-01-1717:49:23【问题描述】:我正在使用primar... 查看详情

SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?

】SQL查询优化:在事实表中两次使用相同指标的最佳方法是啥?【英文标题】:SQLQueryOptimization:whatisthebestapproachtousesamemetrictwiceinthefacttable?SQL查询优化:在事实表中两次使用相同指标的最佳方法是什么?【发布时间】:2020-02-2618:... 查看详情

停止 SQL 在 JOIN 中两次返回相同的结果

】停止SQL在JOIN中两次返回相同的结果【英文标题】:StopSQLreturningthesameresulttwiceinaJOIN【发布时间】:2012-08-3114:53:50【问题描述】:我已经将几个表连接在一起以获取我想要的数据,但由于我是SQL新手,所以我无法弄清楚如何停止... 查看详情

在php中调用soap函数时出错

】在php中调用soap函数时出错【英文标题】:errorincallingsoapfunctioninphp【发布时间】:2013-11-2813:06:33【问题描述】:我如何从这个站点获取php中的肥皂数据http://www2.rlcarriers.com/freight/shipping-resources/rate-quote-instructions他们有“GetRateQuot... 查看详情

不能在一个槽中两次更改 QLabel 文本

】不能在一个槽中两次更改QLabel文本【英文标题】:Can\'tchangeQLabeltexttwiceinaslot【发布时间】:2015-01-1106:42:01【问题描述】:我在以下函数中连续两次更新QLabel文本时遇到问题:voidMainWindow::on_button_clicked()ui->label->setText("Trainin... 查看详情

Google Apps 脚本中两次调用(POST 和 GET)之间的延迟

】GoogleApps脚本中两次调用(POST和GET)之间的延迟【英文标题】:Delayinbetweentwocalls(POSTandGET)inGoogleAppsscript【发布时间】:2021-06-0917:42:56【问题描述】:我在***上的第一个请求!我真的希望你能帮助我!我想创建一个流程来将数据... 查看详情

Spark:在查询中两次使用临时表?

】Spark:在查询中两次使用临时表?【英文标题】:Spark:UseTemporaryTableTwiceinQuery?【发布时间】:2016-04-2820:00:41【问题描述】:我正在努力将一组Hive查询转换为在spark上运行。到目前为止,通过创建TEMP表,我已经获得了不错的性能... 查看详情

尝试调用相同的函数两次传递不同的参数

】尝试调用相同的函数两次传递不同的参数【英文标题】:Attempttocallthesamefunctiontwicepassingdifferentarguments【发布时间】:2014-04-1419:03:00【问题描述】:--在我的主要功能中,我执行以下调用:functionMain()FBIVVoit(1,9,1,0)FBIVVoit(1,9,1,1)end... 查看详情

didreceiveremotenotification函数调用两次(代码片段)

...行到viewcontroller的其他didRecieve,所以在我的情况下导航到两次相同的vc。我该如何处理这个问题?答案如果您正在实施application(_:didReceiveRemoteNotification:fetchCompletionHandler:),这可能是预期的行为,如hereinthedocs所述:注意如果用户... 查看详情

PHP AJAX 12017 调用标头(位置:)时出错 [重复]

】PHPAJAX12017调用标头(位置:)时出错[重复]【英文标题】:PHPAJAX12017ErrorwhencallingHeader(Location:)[duplicate]【发布时间】:2013-02-0117:22:39【问题描述】:我有一个通过AJAX调用PHP文件的jquery函数。在那个PHP文件里面我有header(\'Location:h... 查看详情

在rabbitmq中创建集群时出错

...以下错误。C:\\WindowsandC:\\Users\\&lt;userincontext&gt;目录中两台机器的cookie相同rabbitmqctljoin_cluste 查看详情

在 C++ 中调用指向成员函数的指针时出错

】在C++中调用指向成员函数的指针时出错【英文标题】:ErrorcallingpointertomemberfunctioninC++【发布时间】:2016-01-0108:33:10【问题描述】:我的代码很大,中间有一个错误。这是有错误的部分代码的简化版本。这是我得到的错误://Fol... 查看详情

在查询中使用相同的函数两次(SQL Server)

】在查询中使用相同的函数两次(SQLServer)【英文标题】:Usingthesamefunctiontwiceinaquery(SQLServer)【发布时间】:2010-01-2910:23:37【问题描述】:在SQLServer2005中,当我编写类似的查询时SELECTm.*,a.pricep1,b.pricep2FROMmytablemLEFTJOINproducts_table_1a... 查看详情

如何防止在包含的文件中包含两次相同的文件?

】如何防止在包含的文件中包含两次相同的文件?【英文标题】:HowcanIpreventtoincludesamefiletwiceinanincludedfile?【发布时间】:2012-06-0800:54:26【问题描述】:在主要的index.php文件中,包含header.php。这两个文件都必须插入session.php,databa... 查看详情

在 viewDidLayoutSubviews() 中调用地图视图函数时,地图视图显示两次?

...viewDidLayoutSubviews()中调用地图视图函数时,地图视图显示两次?【英文标题】:MapviewdisplayingtwotimeswhenwecallmapviewfunctioninviewDidLayoutSubviews()?【发布时间】:2018-07-1208:33:51【问题描述】:我正在视图中显示地图。我正在使用自动布局... 查看详情

全局调用异步函数时出错:“等待仅在异步函数和模块的顶层主体中有效”?

】全局调用异步函数时出错:“等待仅在异步函数和模块的顶层主体中有效”?【英文标题】:Erroringlobalcalltoasyncfunction:"awaitisonlyvalidinasyncfunctionsandthetoplevelbodiesofmodules"?【发布时间】:2021-08-1317:35:15【问题描述】:在我... 查看详情

laravel 8 中的文件上传 - 在 null 上调用成员函数 getClientOriginalName() 时出错

】laravel8中的文件上传-在null上调用成员函数getClientOriginalName()时出错【英文标题】:FileUploadinlaravel8-ErrorCalltoamemberfunctiongetClientOriginalName()onnull【发布时间】:2021-11-1502:10:19【问题描述】:我有一个课程管理CRUD。文件上传给我以... 查看详情