2

我正在尝试使用 PHP 从数据库中加载一些数据,但由于某种原因,当我将其放入函数中时它不起作用。如果我尝试没有函数的代码,它可以正常工作:

//$dbc connection
$call1 = 0;
$output = '';
$query = "select * from artists order by lname limit $call1, 15";
$result = mysqli_query($dbc, $query);
while($row = mysqli_fetch_array($result)){
    $output .= "<ul>";
    $output .= "<li>" . $row['name'] . "</li>";
    $output .= "</ul>";
}

但是,当我将代码更改为函数内部时,我没有从数据库中得到任何东西(或者至少它不会返回任何东西):

//$dbc connection
$call1 = 0;
$output = '';
function loadArtists($call){
    $query = "select * from artists order by lname limit $call, 15";
    $result = mysqli_query($dbc, $query);
    while($row = mysqli_fetch_array($result)){
        $output .= "<ul>";
        $output .= "<li>" . $row['name'] . "</li>";
        $output .= "</ul>";
    }
}
loadArtists($call1);

我在这里做错了什么?

4

5 回答 5

5

你不能$dbc在你的函数中使用,因为它是一个global变量。

你可以使用

function loadArtists($call){
    global $dbc;
    ...
}

告知$dbcloadArtists()作为第二个参数传递

function loadArtists($dbc, $call){
...
}

并将其称为

loadArtists($dbc, $call1);
于 2013-04-17T23:09:10.160 回答
3

正如我在其中一条评论中提到的,使用global来修复连接范围是不好的做法。传递连接的正确方法如下:

$dbc = mysqli_connect("localhost", "my_user", "my_password", "world");

$call1 = 0;
$output = '';
function loadArtists($call, $dbc){
    $query = "select * from artists order by lname limit $call, 15";
    $result = mysqli_query($dbc, $query);
    while($row = mysqli_fetch_array($result)){
        $output .= "<ul>";
        $output .= "<li>" . $row['name'] . "</li>";
        $output .= "</ul>";
    }
}
loadArtists($call1, $dbc);
于 2013-04-17T23:16:48.547 回答
2

问题是变量范围该变量在您的函数中不存在。

有三种方法可以处理它:

  1. 使其成为全局变量,这意味着可以从函数内部读取外部变量。(请注意,使用全局变量通常被认为是一个安全问题。)

    global $dbc;
    
  2. 您可以将该变量作为参数传递给函数

    function loadArtists($connection, $call) { ... }
    
  3. 您可以创建一个类,该类变量现在可以在类函数中使用:

    class Artists {
        public $dbc;
        public function __construct() {
            $this->dbc = open_the_db_connection(); //etc?
        }
        public function loadArtists($call) {
            $query = "select * from artists order by lname limit $call, 15";
            $result = mysqli_query($this->dbc, $query);
            while($row = mysqli_fetch_array($result)){
                $output .= "<ul>";
                $output .= "<li>" . $row['name'] . "</li>";
                $output .= "</ul>";
            }
            return $output;
        }
    }
    
于 2013-04-17T23:17:27.037 回答
2

每次要建立数据库连接时,在与您正在执行的代码相同的页面上声明您的用户名和密码是不好的做法,因为:

  1. 如果您移动到与开发环境不同的主机或环境,则可能有多个页面要编辑。
  2. 如果您在 root 之外声明它,您可以限制从 FTP 帐户访问数据库密码。

我喜欢为连接使用一个函数,因此如果连接关闭,您可以随意重新打开它(减少服务器开销)。此外,您不必将其设置为函数内的全局变量(由于多种原因,这不是一个好主意)。

所以出于这些原因,这个连接应该在根之外(下面)。

/../safe/connection.php

function openSQL() {
  $conn = mysqli('localhost', 'my_user', 'my_password', 'my_db');
  return $conn;
}

函数.php

require_once($_SERVER['DOCUMENT_ROOT'].'/../safe/connection.php');
function loadArtists($call){
   $dbc = openSQL();
   $query = "select * from artists order by lname limit $call, 15";
   $result = mysqli_query($dbc, $query);
   while($row = mysqli_fetch_array($result)){
      $output .= "<ul>";
      $output .= "<li>" . $row['name'] . "</li>";
      $output .= "</ul>";
   }
   mysqli_close($dbc);
   return $output;
}

$myOutput = loadArtists(4); 
于 2013-04-17T23:16:30.550 回答
1

对我来说,这似乎是一个范围界定问题。您在函数中引用的 $output 与您在函数外部定义的 $output 不同。

您应该将您的功能更改为以下内容:

function loadArtists($call){
$output = "";
$query = "select * from artists order by lname limit $call, 15";
$result = mysqli_query($dbc, $query);
while($row = mysqli_fetch_array($result)){
    $output .= "<ul>";
    $output .= "<li>" . $row['name'] . "</li>";
    $output .= "</ul>";
}

return $output;

}

$output = loadArtists($call1);

于 2013-04-17T23:12:57.183 回答