2011-02-23 97 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將該變量歸零。