【问题标题】:SQL Query causing page to go blankSQL 查询导致页面变为空白
【发布时间】:2010-10-12 07:23:38
【问题描述】:

我正在使用 php 创建一个网站,但我在使用 SQL 查询时遇到了一些问题。

$dataArray = array();
$result = mysql_query("SELECT * FROM test WHERE web_id='$websiteID'")
    or die(mysql_error());

while ($row = mysql_fetch_array($result)) {
    $k = $row['kfoo'];
    $v = $row['vbar'];
    $dataArray[$k] = $v;
}

这就是应该的代码,但是这会导致页面变为空白(即仅显示全白)。我已经仔细检查过,web_id 绝对是正确的名称和正确的大小写。

如果我将查询中的web_id 更改为,例如,'foo'(基本上不是web_id),那么页面将显示,但会显示错误消息“Unknown column 'foo' in ' where 子句'”。

有人知道是什么原因造成的吗?这是我创建表测试的代码:

$dataDB = "CREATE TABLE test
(
    data_id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(data_id),
    web_id INT,
    kfoo TEXT,
    vbar TEXT
)";

mysql_query($dataDB,$con);  

更新

根据这里的一些答案,我删除了 $websiteID 周围的引号并使用

显示错误
error_reporting(E_ALL);
ini_set('display_errors', 1);

这显示了很多错误,包括之前我已经修复的语法错误。但是,仍然存在许多错误,它们对我来说没有多大意义。这是我的方法的完整代码:

function getOutputSQL($websiteID,$userInput) {
 $result = mysql_query("SELECT * FROM websites WHERE websiteID=$websiteID") 
    or die(mysql_error());

  while ($row = mysql_fetch_array($result)){
    $url = $row['url'];
    $exp = $row['exp'];
    $output= $row['textPrint'];
    $endUrlStart = $row['outUrlStart'];
    $endUrlEnd = $row['outURLEnd'];

    $image = $row['image'];
    $print = $row['print'];
    $post = $row['post'];

    $dataSource = $row['dataSource'];
    $dataSourceName = $row['dataSourceName'];           

  }

  // construct array of data names and values
  $dataArray = array();
  $result = mysql_query("SELECT * FROM test WHERE web_id=$websiteID") 
    or die(mysql_error());

  while ($row = mysql_fetch_array($result)) {
    $k = $row['kfoo'];
    $v = $row['vbar'];
    $dataArray[$k] = $v;
  }

  // construct array of expressions and replacements
  $result = mysql_query("SELECT * FROM regex WHERE web_id=$websiteID");
  $expArray = array();

  while ($row = mysql_fetch_array($result)) {
    $e = $row['ex'];
    $r = $row['re'];
    $expArray[$e] = $r; 
  }

  return getOutput($userInput,$url,$exp,$output,$endUrlStart,
     $endUrlEnd,$dataSource,$dataSourceName,$post,$image,$print,
     $expArray,$dataArray); 
}

我遇到的错误都是这样的——

注意:未定义的变量:在 /home/daniel/web/resultsTest.php 第 113 行输出“

对于 url、exp、output、endUrlStart、endUrlEnd、dataSource、dataSourceName、post、image 和 print 重复几次第 113 行是大返回行。

问题是,据我所知,这些变量已定义,并且我知道表格不是空的,因为我可以在另一个页面上显示它。

已解决

已排序。问题实际上出在我的代码的另一部分——我错误地调用了 getOutputSQL,但我现在已经修复了它!

【问题讨论】:

    标签: php sql


    【解决方案1】:

    一般来说,php 中的空白页表示禁用error notifications。首先,您应该通过 .htaccess 或 php.ini 启用它们。

    顺便说一句:据我所知,整数不应在 SQL 中引用。

    【讨论】:

      【解决方案2】:

      我希望您的实际代码实际上会输出任何内容,如果这是您拥有的所有代码,则不会输出任何内容,因为在没有错误时您不会输出(没有回显或打印是模板或任何东西)

      还要确保设置了 error_reporting 和 display_errors。您可以使用

      从脚本顶部执行此操作
      error_reporting(E_ALL);
      ini_set('display_errors', 1);
      

      这样你就会看到所有的错误。

      编辑
      PHP 有多种类型的错误,包括致命错误、警告和通知。通知告诉您,当您使用未定义的变量或不推荐使用的函数时,您几乎可以忽略它们。您可以更改设置,这样您就不会看到它们:

      error_reporting(E_ALL ^ E_NOTICE);
      

      那么你只会看到真正的错误(警告和致命错误)。

      更多编辑
      那么这些变量是真正未设置的,在调用 getOutput() 之前尝试这样的操作:

      echo "<pre>";
      var_dump($userInput);
      var_dump($url);
      //etc.
      echo "</pre>";
      

      看看变量是否真的设置好了。

      【讨论】:

      • 这暴露了很多错误,这些对我来说都没有多大意义。我已经用新问题更新了问题。
      • 如果我按照您建议的方式禁止通知,我只会得到一个空白页。
      • 变量已设置,但我发现了问题,这与我调用 getOutputSQL 的方式有关。
      【解决方案3】:

      试试这个:

      $dataArray = array();
      if(is_numeric($websiteID){
              $result = mysql_query("SELECT * FROM test WHERE web_id=$websiteID") or die(mysql_error());
      
              while ($row = mysql_fetch_array($result)) {
                      $k = $row['kfoo'];
                      $v = $row['vbar'];
                      $dataArray[$k] = $v;
              }
      }
      

      请注意,我删除了 websiteID 变量周围的 ''。这意味着 mysql 不会将其视为字符串,而是将其视为 int,这是您在 mysql 表创建中指定的。我还检查了 websiteID 是否是一个数字。如果不是,那么执行 sql 查询就没有意义,因为您将得到零个结果。这可以防止 sql 注入。

      【讨论】:

        【解决方案4】:

        您在循环内定义的变量在循环结束时被销毁。这意味着您在第一个 while 循环中创建的输出变量在循环之后不存在。您应该在 while 循环外定义它们,然后在循环内设置值:

        function getOutputSQL($websiteID,$userInput) {
         $result = mysql_query("SELECT * FROM websites WHERE websiteID=$websiteID") 
            or die(mysql_error());
          $url = "";
          $exp = "";
          $output = "";
          //... etc for all the other variables you need in the function at the end.
          while ($row = mysql_fetch_array($result)){
            $url = $row['url'];
            $exp = $row['exp'];
            $output= $row['textPrint'];
            $endUrlStart = $row['outUrlStart'];
            $endUrlEnd = $row['outURLEnd'];
        
            $image = $row['image'];
            $print = $row['print'];
            $post = $row['post'];
        
            $dataSource = $row['dataSource'];
            $dataSourceName = $row['dataSourceName'];                   
        
          }
          // the rest of your function...
        

        【讨论】:

        • 我试过了,页面又变成空白了。发生了一些奇怪的事情。
        猜你喜欢
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 2020-06-25
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        相关资源
        最近更新 更多