我应该将$ mysqli变量传递给每个函数吗?

时间:2012-12-24 02:37:40

标签: php mysql database function mysqli

我遇到一个问题,从mysql_ *传递到面向对象的mysqli。

我的 index.php 文件的结构类似于包含两个文件:

include('connect.php');
include('function.php');

connect.php文件包含:

<?php
$mysqli = new mysqli("localhost", "root", "test", "test");

if (mysqli_connect_errno($mysqli)) {
    printf("Connection failed: %s\n", mysqli_connect_error());
    exit();
}
?>

function.php 文件中有一个名为 showPage 的函数,该函数不带参数但使用 $ mysqli 连接,像......一样......

$result = $mysqli -> query("SELECT * FROM $table ORDER BY ID DESC"); // Seleziono tutto il contenuto della tabella

我无法管理它没有传递给$ mysqli变量这个函数,但是当我使用mysql_ *不推荐的函数时,这不是必需的!

我能理解为什么,以及解决这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

用户定义的函数在PHP中有自己的变量范围。您需要将$mysqli作为参数传递给函数,或者使用global $mysqli启动函数。

这个确切的问题在Variable scope页面上作为示例提供:

  

但是,在用户定义的函数中,本地函数范围是   介绍。默认情况下,函数内使用的任何变量都是   仅限于本地功能范围。 例如,此脚本不会   产生任何输出,因为echo语句引用本地   $ a变量的版本,并没有赋值   在此范围内。您可能会注意到这有点不同   从C语言中,C中的全局变量是自动的   除非被本地特别覆盖,否则可用于功能   定义。这可能会导致人们可能遇到的一些问题   无意中改变了一个全局变量。在PHP中,全局变量必须   如果要在函数中使用,则在函数内声明为全局   那个功能。

<?php
$a = 1; /* global scope */ 

function test()
{ 
    echo $a; /* reference to local scope variable */ 
} 

test();
?>

答案 1 :(得分:0)

经过更好的搜索后,我找到了答案,这适用于任何可能需要它的人:

PHP changing to mysqli. Is the mysqli_connection not global?

这是我需要的答案。无论如何,谢谢所有帮助过我的人

答案 2 :(得分:0)

  

无法管理它没有传递给$ mysqli变量的函数,但是当我使用mysql_ *不推荐使用的函数时,这不是必需的!

这不是真的正确。即使在旧mysql_*函数中,如果需要指定数据库连接相关的内容,实际上也必须传递链接标识符,例如:

$result = mysql_query($sql, $link);

此示例也显示了这一点,您也必须传递$result。如果您遗漏了$link参数:

$result = mysql_query($sql);

mysql扩展确实在内部查找上次使用的连接。如果没有找到,它将创建一个新的参数设置在php.ini中。这只是为了让您的信息更好地理解为什么以及过去如何运作。

答案 3 :(得分:0)

您也可以使用连接池,值得检查this

$mysqli = new mysqli('p:localhost', 'username', 'password', 'db_name');