9

我在从 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

3 回答 3

10

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

这个确切的问题在“变量范围”页面上作为示例给出:

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

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

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

test();
?>
于 2012-12-24T02:57:26.353 回答
0

如果不将 $mysqli 变量传递给函数,就无法让它工作,但是当我使用 mysql_* 不推荐使用的函数时,这不是必需的!

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

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

此外,此示例还显示,您也必须传递$result. 如果您确实遗漏了$link参数:

$result = mysql_query($sql);

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

于 2012-12-24T03:03:05.913 回答
-1

您也可以使用连接池,值得一

$mysqli = new mysqli('p:localhost', 'username', 'password', 'db_name');
于 2014-09-02T06:44:18.670 回答