在函数中包含我的 connection.php 不起作用 php

Posted

技术标签:

【中文标题】在函数中包含我的 connection.php 不起作用 php【英文标题】:Including my connection.php in a function doesn't work 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 - 是的,您的包含代码将起作用。顺便说一句:如果你不做任何像插件这样的小东西,就不要使用全局变量...... 【参考方案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))

以上是关于在函数中包含我的 connection.php 不起作用 php的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sdk 中包含我的库

如何在 Angular js 中包含我的组件的 .css 文件

如何在某些头文件(嵌套类)的 cpp 文件中包含我的实现

在 vue cli3 项目中包含我自己的 js 和 css 文件

使用 grunt、bower、node 模块部署到 heroku

require_once 问题,当调用另一个文件中包含的函数时