【问题标题】:Including my connection.php in a function doesn't work php在函数中包含我的 connection.php 不起作用 php
【发布时间】:2016-06-28 19:29:16
【问题描述】:

在我的 php 文件中使用一些简单的 sql 查询注入来处理一个小项目。我创建了一个functions.php 文件,其中包含一个名为function displayimage() 的函数。我将我的函数文件包含在我的索引文件中并像这样使用该函数

index.php

            <div class="col-lg-2">
              <?php displayimage(); ?>
            </div>

函数.php

 function displayimage()
{

$dbCon = mysqli_connect("localhost", "root", "root", "testdb");

if (mysqli_connect_errno()) {
    echo "Failed to connect: " . mysqli_connect_error();
}

$sql= "SELECT * FROM `images` ORDER BY `images`.`id` DESC ";

$query=mysqli_query($dbCon, $sql);

if ($row = mysqli_fetch_array($query))
{
    echo '<img class="img-responsive" style="margin-top: 10px;" src="data:image;base64,'.$row[2].' "> ';
}

mysqli_close($dbCon);

 }
 ?>

所以它工作正常但是.. 我试图通过将数据库连接放在一个单独的文件中来清理我的代码,并像include('connection.php'); 一样包含它。不幸的是,我的代码不再起作用,并且内容不会显示在我的索引文件中。我的 PHPStorm 说 $dbCon 现在是一个无法定义的变量。我在这里做错了什么?

新函数.php

function displayimage()
{

include('connection.php');

$sql= "SELECT * FROM `images` ORDER BY `images`.`id` DESC ";

$query=mysqli_query($dbCon, $sql);

if ($row = mysqli_fetch_array($query))
{
    echo '<img class="img-responsive" style="margin-top: 10px;" src="data:image;base64,'.$row[2].' "> ';
}

mysqli_close($dbCon);

 }
 ?>

连接.php

$dbCon = mysqli_connect("localhost", "root", "root", "testdb");

if (mysqli_connect_errno()) {
echo "Failed to connect: " . mysqli_connect_error();
}

【问题讨论】:

  • 请添加connection.php的内容
  • 这是一个变量范围问题。
  • $dbCon 在函数内部不存在,函数具有本地范围,而 $dbCon (可能)在全局范围内创建。您需要将连接传递给函数displayImage($dbCon) 和/或重构您的代码。请不要使用全局变量。
  • 函数不“支持”未包含或限定在其中的变量。您需要将变量设为全局变量,这是一个坏主意,或者召回它
  • @GlennGijsberts - 是的,您的包含代码将起作用。顺便说一句:如果你不做任何像插件这样的小东西,就不要使用全局变量......

标签: php mysql mysqli database-connection


【解决方案1】:

如果您想与数据库建立连接,您应该在页面顶部添加connections.php。但是,如果您使用的是 mysqli,我建议您在程序上使用面向对象的语法。这样您就不必在每次查询时解析 $connection 变量。

require_once 'connection.php';

function displayimage(){
  global $dbCon;

  $sql= "SELECT * FROM `images` ORDER BY `images`.`id` DESC ";
  if($qry= mysqli_query($dbCon, $sql) != false){
    // query ran successfully, here you should actually continue the code..
    while($row = mysqli_fetch_array($query)){
      echo '<img class="img-responsive" style="margin-top: 10px;" src="data:image;base64,'.$row[2].' "> ';
    }
  } else {
    echo 'failed to retrieve images from the database.';
  } 


}

此外,您不必在每次完成查询时都关闭连接。它在脚本结束时自动完成,没有它可以继续使用已经打开的连接。

但是在函数中使用全局变量是不好的做法,只要确保你永远不会覆盖 $dbCon 变量,当使用其他人的代码时可能会发生这种情况。

【讨论】:

  • 好的。我明白了,它起作用了,也许这种方式比以前更干净了。但是,上面有 2 个人建议不要使用全局变量。我为什么要使用它?
  • 我做了一些编辑,但要回答你的问题,我会说它在那里可以使用,但是在这种特殊情况下,我们谈论的是一个脆弱的变量。如果它被覆盖,您的代码将大量失败,并且在处理您使用的错误(没有)时,您将无法诊断它。但它伴随着经验来寻找保护变量的方法。例如,包装在类中(这就是为什么我建议使用 mysqli OO-Style(或 PDO))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2014-05-15
  • 2014-05-23
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多