2011-02-23 214 views
0

我有一个小的PHP脚本,只是连接到数据库并将某个表转储到屏幕上。PHP脚本不会查询数据库

// Replaced with expanded snippet below 

此代码抛出错误,说$menu为NULL。但相同的脚本

// Also replaced with expanded snippet below 

执行的精细和它们使用相同的文件,以获得$menu用相同的连接特性。 mysql_connectmysql_select_db函数都被称为func() or die(mysql_error()),我没有从它们回来的任何错误。任何想法可能是什么原因?

这里是我的连接代码:

<?php 
# FileName="Connection_php_mysql.htm" 
# Type="MYSQL" 
# HTTP="true" 
$hostname_menu = ""; 
$database_menu = ""; 
$username_menu = ""; 
$password_menu = ""; 
$menu = mysql_connect($hostname_menu, $username_menu, $password_menu) or die(mysql_error()); 
$menu_db = mysql_select_db($database_menu, $menu) or die(mysql_error()); 
?> 

我节录的变量。我已经检查过了,没有文件阴影或使用$菜单用于其他目的。

这是索引页。我没有写这个,只是你知道的。

<?PHP 
session_start(); 
if($_SESSION['login'] != "true"){ 
    header("Location: login.php"); 
}else{} 
?> 
<?PHp include("includes/top.php"); ?> 
<?PHP include("includes/menu.php"); ?> 
<div id="main_page"> 
    <div id="page2">  
     <?PHP 
      if($_REQUEST['page'] == ""){ 
       include("pages/index.php");   
      }else{   
       include("pages/".$_REQUEST['page'].".php"); 
      }   
     ?>  
    </div>  
</div>  
<?PHP include("includes/bottom.php"); ?> 

其他PHP包括实际上是纯HTML,并没有定义任何额外的变量。上面的第一个代码段扩展为

<!-- semester1.php --> 
<?php 
include('includes/db.php'); 
function spew_bookings() { 

    $roomquery = "SELECT * FROM php_bookingtable"; 
    $result = mysql_query($roomquery, $menu); 
    while($row = mysql_fetch_assoc($result)) { 
     foreach($row as $key => $value) { 
      echo $key; echo '<br>'; echo $value; 
     } 
    } 
} 
function spew_user_bookings(){ 

} 
if ($_SESSION['deptid'] == 'Central Administrator') { 
    spew_bookings(); 
} else { 
    spew_user_bookings(); 
} 
?> 

并包含在上面的index.php中。另一个文件被重定向,不包括在内,而且看起来是这样的:

<?PHP  
    session_start();   
    include("../includes/db.php");  
    $loginQuery = "SELECT * FROM php_usertable WHERE username = '".$_REQUEST['username']."'"; 
    $loginResult = mysql_query($loginQuery, $menu); 
    $loginRow = mysql_fetch_array($loginResult); 
    $password = $_REQUEST['password'];  
    //-- get their department from their department id --// 
    $deptQuery = "SELECT * FROM php_departmenttable WHERE deptid = '".$loginRow[3]."'"; 
    $deptResult = mysql_query($deptQuery, $menu); 
    $deptRow = mysql_fetch_array($deptResult); 

    if(md5($password) == $loginRow[2]){ 

     //-- set all the users information into sessions --// 
     $_SESSION['username'] = $loginRow[1];  //-- from usertable --// 
     $_SESSION['deptid'] = $deptRow[1];   //-- from depttable --// 
     $_SESSION['extension'] = $loginRow[4]; 
     $_SESSION['email'] = $loginRow[5]; 

     $_SESSION['login'] = "true"; 
     header("Location: ../index.php");   
    }else{  
     header("Location: ../login.php");   
    }   
?> 

我知道有安全漏洞在这里,但他们现在是不是一个问题。

+5

如果您希望我们帮助调试,您将不得不分享您包含的其他代码。没有办法让'$ menu'成为'NULL'。即使失败的'mysql_connect'调用会导致'FALSE',而不是'NULL'。 –

+0

@Dan:我在连接脚本中编辑过。 – Puppy

+0

这是不可能的,你包括该代码和'$菜单'为空,除非有额外的代码。我希望你没有包含那个文件,要么不使用'include' /'require',要么你提供了一个错误的路径,'include'失败。是不是在黑暗中调试乐趣? –

回答

1

在您的功能spew_bookings() 您参考$menu这是没有定义。在这种情况下,你会得到由PHP抛出一排两个错误:

  1. 一个警告,$menu未定义
  2. 错误,指出$menu是你mysql_query通话

也许你需要空一个global $menu在你的功能开始?

+0

我不相信我们都错过了... @DeadMG:如果错误位置对应于该函数中对菜单的引用,那就是问题所在。如果你没有错误,那么你会在某个时候,因为在函数外部定义的变量不能在没有全局关键字的情况下引用......除非你通过像'$ _SESSION','$ _POST'这样的超级全局访问它们, '$ _GLOBALS'等。看看[变量范围](http://php.net/manual/en/language.variables.scope.php) – prodigitalson

+0

我没有得到警告,但得到了错误。这解决了问题 - 谢谢。 – Puppy

0

首先要做的是注意错误信息。 IT会告诉你什么行和$menu是什么文件是null在。找到那条线......然后查看以相反顺序发生的所有事情。

正如其他人在他们的评论中所说,你的connect和select_db函数的结果不能产生一个空值......并且该变量已经被定义(否则它会认为它是未定义的而不是null)调用堆栈并包含somethign将该变量归零。