Php 我是否需要在定义的每个函数中建立另一个数据库连接?

Php 我是否需要在定义的每个函数中建立另一个数据库连接?,php,sql,Php,Sql,让我们创建一个非常简单的示例文件: index.php: <?php $connection = mysqli_connect('localhost', 'user', 'pass', 'db'); // connection established successfully echo 'doing something here for like 500 lines of code'; include('functions.php'); echo countCTR(12, 15);

让我们创建一个非常简单的示例文件:

index.php

<?php

$connection = mysqli_connect('localhost', 'user', 'pass', 'db');
// connection established successfully

echo 'doing something here for like 500 lines of code';

include('functions.php');
echo countCTR(12, 15);

?>
<?php

function countCTR($input1, $input2){
   /* in this function I need my database connection ($connection)
      which was established already in index.php before this
      file was included. however, the $connection isn't open
      inside this function. Do I have to execute mysqli_connect
      inside every function I define?
   */
}

?>
你不应该这样做。
只需使用
global
关键字

function countCTR($input1, $input2){
    global $connection;
}
使用该功能,您将很好。此函数重新使用已建立的数据库连接

编辑1:一个更好的选择是按照Mark的建议,将
$connection
作为参数传递给函数。我当然反对使用全局变量,除非真的有必要。它理所当然地被认为是一种糟糕的编程实践,只会让你头疼

编辑2:您有三种选择:

  • 检查$connect是否为空,如果为空,则按照Mensur的建议以错误方式退出。如果它不为null,则可以通过将$connection作为参数传递给使用数据库的函数,在脚本的其余部分可靠地使用它

  • 再次检查$connect是否为NULL,如果不是,则将其用作函数中的全局变量。我反对这种方法,原因见编辑1

  • 使用
    mysql\u pconnect()
    函数,它将创建一个持久连接,以后对mysql\u pconnect()的任何调用都将使用相同的连接(如果已建立)


  • 不,你没有。只创建一个连接就足够了。 好主意是在另一个文件中创建数据库连接,然后将其包含在index.php或任何其他文件中

    例如: database.php

    <?php 
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
     {
     die('Could not connect: ' . mysql_error());
     }
    ?>
    
    
    
    例如: index.php

    <?php include("database.php");?>
    
    
    
    希望这有帮助。=)

    这是解释

    您有两种选择:将$connection设置为全局,或将其传递给方法。我更喜欢后者——全局变量让我紧张

    要传入连接,请更改函数定义,如下所示:

    <?php
    
    function countCTR($input1, $input2, $connection){
       /* in this function I need my database connection ($connection)
          which was established already in index.php before this
          file was included. however, the $connection isn't open
          inside this function. Do I have to execute mysqli_connect
          inside every function I define?
       */
    }
    
    ?>
    
    echo countCTR(12, 15, $connection);
    
    正如评论中提到的,考虑故障模式并以结构化的方式处理异常是一种很好的做法。您发布的示例代码(我已经修改过)在将连接传递到函数之前不会检查连接是否有效;它也不会检查函数中的连接是否仍然可用


    您需要确保您的错误处理策略能够处理此问题,但这与您最初的问题没有严格的关系。

    您可以使用两种方法来处理此问题 1.将$connection链接标识符声明为全局

       <?php 
          global $connection = mysql_conect(....); 
          include_once 'yourfile.php';
          $functionReturnValue = CalledFunction( $para1, $para2 );
       ?>
    
    
    
    现在您的yourfile.php将如下所示

       <?php
         function CalledFunetion()
         {
            global $connection;
            // Put rest of the code
         }
       ?>
    
    
    
  • 使用mysql_pconnect()函数

  • :)

    将连接作为附加参数传递给function@MarkBaker:我相信我已经尝试过了,但没有成功。你必须检查$connection是否为NULL,如果为NULL,你必须在每个方法中调用mysql\u connect()。这就是为什么我建议调用mysql_pconnect(),这样您就不必进行检查了。。。正如我在下面所写的,
    mysql\u pconnect()
    将重用您以前建立的连接(如果存在),如果不存在,它将建立另一个连接。@MarkBaker:尽管在本例中您传递的是一个全局变量。你应该传递一个全局变量吗?这是一个完全脱离主题的问题,我应该吗?是你想出了你无法证明的答案。(差了一英里)。仔细阅读你提供的链接应该会给你足够的证据。我从96年开始阅读PHP手册。。。自PHP4中首次引入mysql_pconnect()以来,就一直使用它。所以,没必要再看一遍。如果RiMMER在他的第一个脚本中建立了一个持久连接,那么以后他可以安全地再次调用mysql_pconnect()。这不是最好的方法(最好是传递不为NULL的已建立的$connection),但它肯定会很好地工作。如果您亲自阅读代码,您将看到他没有检查$connection是否已实际建立。。。所以他必须在函数中完成,或者检查null(你否决了这个建议!)。他也可以调用mysql(i)\u connect。在这里使用持久连接有什么意义?抱歉,伙计,尽管你已经阅读了16年的手册,但你似乎不理解pconnect的东西。对于常规连接,您的(3)也是正确的
    使用mysql\u connect()函数,以后对mysql\u connect()的任何调用都将使用相同的连接(如果已建立)。
    pconnect没有任何用处,它无法解决OP的问题。这没有帮助——即使我将连接包含到每个函数中,我仍在一次又一次地建立连接。您认为,是否有必要阅读整个问题或只是标题就足够了?我的错,对不起。。。是为了快速回答:P@Mensur:您的代码实际上很好。使用OP的方法,脚本应该按照您的建议退出,或者他必须检查他稍后调用的每个依赖于该连接的函数中是否存在null!他仍然需要检查$connection是否为空,如果为空,则调用
    mysql\u connect()
    。。。或者,如果在第一次调用mysql_connect()后无法建立连接,则返回错误。。。这也是一个很好的选择。@DejanLekic似乎你的观点(开发人员应该在每次调用mysql之前检查连接)没有被其他人分享。@Col.shrapanel:嗯,他没有检查脚本中是否建立了连接(如Manus所建议的)。那么,他如何确定是否建立了连接?他要么照马努斯写的做,要么就得检查!除了让脚本失败之外,还有其他选择吗?我认为@DejanLekic有一点-但它与这个问题没有严格的关系,这个问题实际上是关于PHP中变量的范围…我已经相应地更新了答案。对不起,我忍不住要问你的答案。传递$connection在我看来很奇怪。我知道您自己从来不会在代码中传递它,而是使用对象范围的全局变量。但无论如何,传递$connection只是出于某种迷信,而不是出于真正的需要,这在我看来很奇怪。@Blowski:OP i