2015-11-21 48 views
-1

我在做用戶配置文件頁面,並且此人必須顯示當前的信息。但是,當我顯示的頁面,它顯示這樣的錯誤: 未定義變量:電話號碼在C:\ wamp \ www \ Assignment \ userpage.php在線97從while循環的外部獲取變量

我無法找到問題,對我來說似乎都沒問題。

<!doctype html> 
<html> 
<head> 
<?php 
header('Content-type: text/html; charset=utf-8'); 
$link = mysqli_connect("localhost", "root", ""); 
if (!$link) { 
    die('Could not connect : '.mysql_error()); 
} 
$db = mysqli_select_db($link, 'assignment'); 
if (!$db) { 
    die('Could not select db : '.mysql_error()); 
} 

if ($_SESSION['loggedin'] = true) { 
    $query = mysqli_query($link, "SELECT UserID FROM users WHERE  UserID=.\$_SESSION['UserID']"); 
} 
$UserID = $query; 
$result = mysqli_query($link, "SELECT * FROM users where UserID='$UserID'"); 
while ($row = mysqli_fetch_array($result)) { 
    global $Lname, $Fname, $PhoneNumber, $Gender, $DOB, $Email; 
    $Lname = $row['Lname']; 
    $Fname = $row['Fname']; 
    $PhoneNumber = $row['PhoneNumber']; 
    $Gender = $row['Gender']; 
    $DOB = $row['DOB']; 
    $Email = $row['Email']; 
    echo 'nananananana'; 
} 
?> 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Movie Renting</title> 
<link href="style.css" rel="stylesheet" type="text/css"> 
</head> 
<body id="wrapper"> 
<div class="order"> 
<h1>Таны бүртгэлийн мэдээлэл:</h1> 
<form action = "userpage.php" method = "post"> 
    <table frame="box" style="width:900px; height:auto"> 
<tr> 
<td> Овог:</td> 
<td> <?php echo $Lname ?></td> </tr> 

<tr> 
<td> Нэр:</td> 
<td> <?php echo $Fname ?></td> </tr> 

<tr> 
<td> Хэрэглэгчийн нэр:</td> 
<td> <?php echo $UserID ?></td> </tr> 


<tr> 
<td> E-шуудан:</td> 
<td> <?php echo $Email ?> </td> </tr> 

<tr> 
<td> Утасны дугаар:</td> 
<td> <?php echo $PhoneNumber ?></td> </tr> 

<tr> 
<td> Хүйс:</td> 
<td> <?php echo $Gender ?></td> </tr> 

<tr> 
<td> Төрсөн он сар өдөр: </td> 
<td> <?php echo $DOB ?></td> </tr> 

<a href = "useredit.php">Өөрийн мэдээллээ засах бол энд дарна уу.</a> 
</table> 

</form> 
</div> 
</body> 
</html> 
+3

嘗試在while.why之外聲明它們爲什麼要一起使用mysql和mysqli函數。 –

+2

這是97行,你的數據庫是怎樣的? – JRsz

+0

在外面申報我應該寫什麼代碼? like:declare $ Fname; ?? –

回答

1

變量的範圍即它被定義的上下文。大多數情況下,所有PHP變量只有一個範圍。這個單一的範圍跨越了包含和必需的文件。

例如:

讓我們在一個文件中假設,使用example.php,您有以下:

<?php 

$foo = "Hello World"; // global scope 

function hello() { 
    echo $foo; // reference to local scope 
} 

hello(); 
?> 

這個腳本將不會產生任何輸出,因爲在該函數的echo語句打招呼( )引用$ foo變量的本地版本,並且在此範圍內尚未分配一個值。現在

,如果你想獲得對已經定義或聲明的全局範圍變量$ foo的,從功能您好()內,那麼你就需要使用全球聲明變量$ foo的從函數內的關鍵字,如:

<?php 

$foo = "Hello World"; // global scope 

function hello() { 
    global $foo; 
    echo $foo; // reference to local scope 
} 

hello(); 
?> 

立即調用hello()函數將產生:

Hello World 

雖然塊不具有內有限範圍它的區塊,因此,同樣的原則不適用,但在while區塊外不存在變量確實會影響變量時,使用全局關鍵字在while-block內定義變量。

所以在你而塊,你目前有:

while ($row = mysqli_fetch_array($result)) { 
    global $Lname, $Fname, $PhoneNumber, $Gender, $DOB, $Email; 
    $Lname = $row['Lname']; 
    $Fname = $row['Fname']; 
    $PhoneNumber = $row['PhoneNumber']; 
    $Gender = $row['Gender']; 
    $DOB = $row['DOB']; 
    $Email = $row['Email']; 
    echo 'nananananana'; 
} 

要麼定義變量$ LNAME,FNAME $,$ ******中國,$性別,出生日期$,$電子郵件,在全球範圍之外while-塊,或將全局變量,而塊範圍之外,所以你可以訪問它們,比如:

global $Lname, $Fname, $PhoneNumber, $Gender, $DOB, $Email; 
while ($row = mysqli_fetch_array($result)) { 
    $Lname = $row['Lname']; 
    $Fname = $row['Fname']; 
    $PhoneNumber = $row['PhoneNumber']; 
    $Gender = $row['Gender']; 
    $DOB = $row['DOB']; 
    $Email = $row['Email']; 
    echo 'nananananana'; 
} 

或者,我會做這樣的事情:

$Lname = '', $Fname = '', $PhoneNumber = '', $Gender = '', $DOB = '', $Email = ''; 
while ($row = mysqli_fetch_array($result)) { 
    global $Lname, $Fname, $PhoneNumber, $Gender, $DOB, $Email; 
    $Lname = $row['Lname']; 
    $Fname = $row['Fname']; 
    $PhoneNumber = $row['PhoneNumber']; 
    $Gender = $row['Gender']; 
    $DOB = $row['DOB']; 
    $Email = $row['Email']; 
    echo 'nananananana'; 
} 

或者即使你將不會被調用文件中的其他文件,在這種情況下使用全球關鍵字實際上是不必要的,您可以通過以下方式實現這一點:

$Lname = '', $Fname = '', $PhoneNumber = '', $Gender = '', $DOB = '', $Email = ''; 
while ($row = mysqli_fetch_array($result)) { 
    $Lname = $row['Lname']; 
    $Fname = $row['Fname']; 
    $PhoneNumber = $row['PhoneNumber']; 
    $Gender = $row['Gender']; 
    $DOB = $row['DOB']; 
    $Email = $row['Email']; 
    echo 'nananananana'; 
} 

從效率的角度來考慮它,爲什麼你想在每個循環迭代循環中調用global關鍵字?我只是在while循環之外定義/聲明變量,並且在循環遍歷迭代過程時將賦值賦值給while循環。

變量範圍可能會有點棘手,希望這有助於。

+1

'雖然塊在PHP中的範圍不受限制。只有函數,類,方法和閉包的範圍有限。即您可以在while循環外聲明一個變量並直接在while循環內訪問它。 –

+0

哇這真的很有幫助。 謝謝。 –

0

你不需要使用全局關鍵字。

只是在while循環之外聲明你的變量。

$PhoneNumber= ""; 

while ($row = mysqli_fetch_array($result)) { 
    $Lname = $row['Lname']; 
    $Fname = $row['Fname']; 
    $PhoneNumber = $row['PhoneNumber']; 
    $Gender = $row['Gender']; 
    $DOB = $row['DOB']; 
    $Email = $row['Email']; 
    echo 'nananananana'; 
} 
echo $PhoneNumber; 

現在您可以從while循環之外訪問$ PhoneNumber。

謝謝。

+0

是的。你是否獲得除$ PhoneNumber之外的所有其他變量? –

0
  1. 您的「$ _SESSION ['loggedin'] = true」將始終返回true,因爲它是一個分配者,沒有比較。 !empty()可以防止未定義的索引 - 通知。
  2. 將UserId轉換爲整數以防止SQL注入(即使它應該是可信來源)
  3. 如果即使沒有人登錄(或在數據庫中找不到),也需要空變量,則必須聲明它們。
  4. 你傳遞一個mysqli的結果對象(你在第一次mysqli_query得到什麼)作爲字符串參數,它不會像
  5. 工作一段時間($行= mysqli_fetch_assoc())將返回最後一個用戶,如果(。 。) 首先。如果它是主鍵(userID表明這一點),結果是相同的。

這裏是一個更正的代碼:

$Lname  = ''; 
$Fname  = ''; 
$PhoneNumber = ''; 
$Gender  = ''; 
$DOB   = ''; 
$Email  = ''; 
if (!empty($_SESSION['loggedin'])) 
{ 
    $result = mysqli_query($link, 
     "SELECT * FROM users WHERE UserID=" . (int)$_SESSION['UserID'] 
    ); 
    if ($row = mysqli_fetch_array($result)) 
    { 
     $Lname  = $row['Lname']; 
     $Fname  = $row['Fname']; 
     $PhoneNumber = $row['PhoneNumber']; 
     $Gender  = $row['Gender']; 
     $DOB   = $row['DOB']; 
     $Email  = $row['Email']; 
    } 
} 
+0

哦謝謝。學習太多了。 –