【问题标题】:external php inclusion for table generation用于表生成的外部 php 包含
【发布时间】:2017-05-13 01:54:31
【问题描述】:

我在做一个项目时一直在自学 PHP,所以我的代码可能不是最优雅的,我还在学习。我真的很想稍微清理一下我的代码,并制作一些合理的函数来替换我大量的意大利面条代码。我已经让测试函数正常工作,但是现在我想用一个函数生成我的表,但我遇到了问题并且没有生成错误,这使得调试很麻烦。我有三个文件“functions.php”、“tblDesc.php”和“index.php”,如下所示

index.php:

<html>
<?php
require 'header.php'
?>
 <head>
    <title>
      Asset Manager
     </title>
 </head>
 <body>
 <?php
 include_once('navBar.php');
 ?>
<?php
include_once('tblDesc.php');
?>
    </body>

functions.php:

<?php
function initTable($query, $tblID){
    // Begin Table generation

    print "<table id='".$tblID."'> ";
    $result = $dbAssetManTest->query($query);
    $row = $result->fetch(PDO::FETCH_ASSOC);
    print "<thead>";
    print " <tr> ";
    // pulls field data for table generation
    foreach ($row as $field => $value){
        print " <th>$field</th> ";
    }
    print " </tr> ";
    print "</thead>";
    // end foreach
    //body of Table
    print "<tbody>";
    // pulls live data from DB
    $data = $dbAssetManTest->query($query);
    $data->setFetchMode(PDO::FETCH_ASSOC);
    foreach($data as $row){
        print " <tr> ";
        foreach ($row as $name=>$value){
            print " <td>$value</td> ";
        } // end field loop
        print " </tr> ";
    } // end record loop
    print "</tbody>";
    print "</table>";
}
?>

tblDesc.php

<?php
require "functions.php";

// Begin Table generation
$queryBR="select foo from bar;";
$tblIDBR='tblFooBar';

initTable($queryBR, $tblIDBR);
?>

如果我获取函数initTable 的内容并将initTable($queryBR, $tblIDBR); 行替换为functions.php 中的内容,一切正常,但是;当我尝试将传递给它的函数 vaulues 查询和 tableID 分开时,我的页面在&lt;table id='tblBROnHand'&gt; 处停止加载。

这样可以,但看起来很糟糕:

<?php
// Begin Table generation
$queryBR="select foo from bar;";
$tblID='tblFooBar';
// Begin Table generation
print "<table id='".$tblID."'> ";
$result = $dbAssetManTest->query($queryBR);
$row = $result->fetch(PDO::FETCH_ASSOC);
print "<thead>";
print " <tr> ";
// pulls field data for table generation
foreach ($row as $field => $value){
    print " <th>$field</th> ";
}
print " </tr> ";
print "</thead>";
// end foreach
//body of Table
print "<tbody>";
// pulls live data from DB
$data = $dbAssetManTest->query($queryBR);
$data->setFetchMode(PDO::FETCH_ASSOC);
foreach($data as $row){
    print " <tr> ";
    foreach ($row as $name=>$value){
        print " <td>$value</td> ";
    } // end field loop
    print " </tr> ";
} // end record loop
print "</tbody>";
print "</table>";
?>

任何帮助将不胜感激!

【问题讨论】:

  • 放入 ini_set('display_errors',1);在文件的开头,或查看 PHP/Apache 错误日志
  • 在没有自定义函数的情况下运行您的代码。如果它有效,你会看到需要添加一些东西。这是一个变量范围。
  • 我想你会发现这是一个 SCOPE 问题,通常是当你将代码移动到函数中时
  • $dbAssetManTest 在函数中不可见,除非您将其作为参数传入
  • 我没有看到$dbAssetManTest 定义在你说的代码中也有效

标签: php html dom web-applications


【解决方案1】:

因为您现在已经为该代码创建了一个函数,所以您已经更改了其中使用的变量的范围。

换句话说,主行代码中的变量不再对函数内的代码可见,即$dbAssetManTest变量

所以将该变量作为参数传递给函数,然后它将在函数内可见和可用

<?php
function initTable($dbAssetManTest, $query, $tblID){
    // Begin Table generation

    print "<table id='".$tblID."'> ";
    $result = $dbAssetManTest->query($query);
    $row = $result->fetch(PDO::FETCH_ASSOC);
    print "<thead>";
    print " <tr> ";
    // pulls field data for table generation
    foreach ($row as $field => $value){
        print " <th>$field</th> ";
    }
    print " </tr> ";
    print "</thead>";
    // end foreach
    //body of Table
    print "<tbody>";
    // pulls live data from DB
    $data = $dbAssetManTest->query($query);
    $data->setFetchMode(PDO::FETCH_ASSOC);
    foreach($data as $row){
        print " <tr> ";
        foreach ($row as $name=>$value){
            print " <td>$value</td> ";
        } // end field loop
        print " </tr> ";
    } // end record loop
    print "</tbody>";
    print "</table>";
}
?>

当你调用它时,将参数添加到函数中

<?php
require "functions.php";

// Begin Table generation
$queryBR="select foo from bar;";
$tblIDBR='tblFooBar';

initTable($dbAssetManTest, $queryBR, $tblIDBR);
?>

最好不要直接从函数或方法输出,而是构建一个你想要输出的字符串并从函数返回。这样就可以在调用后影响输出。在这种情况下并不容易,但作为一般规则,至少它是可能的

所以

<?php
function initTable($dbAssetManTest, $query, $tblID){
    // Begin Table generation

    $htm = "<table id='".$tblID."'> ";
    $result = $dbAssetManTest->query($query);
    $row = $result->fetch(PDO::FETCH_ASSOC);
    $htm .= "<thead>";
    $htm ,=  " <tr> ";
    // pulls field data for table generation
    foreach ($row as $field => $value){
        $htm .= " <th>$field</th> ";
    }
    $htm .= " </tr> ";
    $htm .= "</thead>";
    // end foreach
    //body of Table
    $htm .= "<tbody>";
    // pulls live data from DB
    $data = $dbAssetManTest->query($query);
    $data->setFetchMode(PDO::FETCH_ASSOC);
    foreach($data as $row){
        $htm .= " <tr> ";
        foreach ($row as $name=>$value){
            $htm .= " <td>$value</td> ";
        } // end field loop
        $htm .= " </tr> ";
    } // end record loop
    $htm .= "</tbody>";
    $htm .= "</table>";

    return $htm;
}
?>

当你调用它时,将参数添加到函数中

<?php
require "functions.php";

// Begin Table generation
$queryBR="select foo from bar;";
$tblIDBR='tblFooBar';

$htm = initTable($dbAssetManTest, $queryBR, $tblIDBR);
echo $htm;
?>

【讨论】:

  • 谢谢!
【解决方案2】:

将以下代码添加为函数的第一行,

global $dbAssetManTest;

【讨论】:

  • global yuk yuk 咳咳咳咳……呕吐
  • @RiggsFolly,你能告诉我使用全局数据库连接的问题吗?我最近在一个项目中做到了这一点,它奏效了。这就是我在这里建议的原因。对不起,如果我的回答误导了 OP
  • 这只是一个可怕的想法。而是将连接作为参数传递给函数。
  • 是的,从您的评论中我了解到这可能是一个可怕的想法。但是你能告诉我这个问题吗
  • 使用全局的问题在于,如果您更改全局,代码中的任何位置都会影响使用它的任何内容。而且这往往是错误的,会产生深远的影响
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多