台灣最大程式設計社群網站
線上人數
950
 
會員總數:246135
討論主題:189716
歡迎您免費加入會員
討論區列表 >> PHP >> PHP查詢MySQL語法問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
PHP查詢MySQL語法問題
價值 : 150 QP  點閱數:4309 回應數:16
樓主

towns 版主
中級專家
5027 174
5576 901
發送站內信

捐贈 VP 給 towns
towns仿書上的資料寫了一段資料庫查詢的程式,但這段程式無法正常出現查詢結果,towns也無法從中看出為何無法查詢,先將該程式放上來,並請大大們協助

這段程式towns有幾個問題要請教
1.在第一段PHP程式中,towns並無法判斷是否有正常連結資料庫,或是否有正常取得資料庫中的資料,也請大大指導
2.在第二段PHP程式中,依語法來看,如果打入的人名不存在資料庫中,也該顯示查無此人,但這一段資訊完全沒有顯示,towns不知道生了什麼事,請大大指點

煩請大大們,告訴 towns 書中的範例問題在哪裡!謝謝 ^^

搜尋相關Tags的文章: [ php ] , [ mysql ] ,
本篇文章發表於2013-12-13 16:57
== 簽名檔 ==
來吧~~~電腦:http://blog.xuite.net/towns/hc
專修小問題:http://hc.chongyang-go.idv.tw
1樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
針對第一個程式碼, 你好像太早close了...


第10行之後你可以用 if(!$result) ...

http://www.php.net/mysql_query 的例子有範例寫法...
<?php
$result = mysql_query('SELECT * WHERE 1=1');
if (!$result) {
die('Invalid query: ' . mysql_error());
}
?>


總之, 要close之前, 你應該要先取得資料..., 最後才close
本篇文章回覆於2013-12-13 17:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
第2段是指, 人名不存在時, 【表格】看不到, 也看不到【查無此人】嗎?

你試著在第2段的35行之後加一個else

else
{
echo "num很神奇的變成null";
}
本篇文章回覆於2013-12-13 17:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

towns
捐贈 VP 給 towns 檢舉此回應
謝謝小羊大的回應
1.關於close的部分,towns來試試
2.使用if來修改第10行,對哦。這麼做,就可以確定是否可正常連入

第二段是問題是指,表格看的到但,查無此人不會出現 ^^"
本篇文章回覆於2013-12-13 17:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

towns
捐贈 VP 給 towns 檢舉此回應
小羊大,我將 mysql_close($link_ID); 這一段移到第一段程式碼的最下面,還是沒有用呢!

對了,小羊大,第二個程式碼,是可以正常回應的,並沒有問題 ^^",所有的問題都是在問第一個程式碼,不好意思,towns應該將第二個程式碼拿掉的 ^^"
本篇文章回覆於2013-12-13 18:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
如果...
你的
第一段是指1~15行,
第二段是指18~36行...

請把mysql_close($link_ID);放在第36行...

(或是不要寫這一行)
本篇文章回覆於2013-12-13 21:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
更正一下...(我被2種程式碼影響了)

如果...
你的
第一段是指1~17行,
第二段是指26~38行...

請把mysql_close($link_ID);放在第38行之後...
也就是說放在頁面最後面...(確定讀完資料的後面)

或是不要寫這一行
本篇文章回覆於2013-12-13 21:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

towns
捐贈 VP 給 towns 檢舉此回應
謝謝小羊大,towns再來試一試
本篇文章回覆於2013-12-14 16:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
原則上如小羊說的。第一支php程式問題是在mysql_close沒錯。太早關了。

所以後面要取資料已經取不到了。
本篇文章回覆於2013-12-15 02:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

towns
捐贈 VP 給 towns 檢舉此回應
測試結果回應
1. 關於mysql_query 錯誤回應問題
小羊大您說在 第10行後加入
if (!$result) {
die('Invalid query: ' . mysql_error());
}
但加入後,towns 試著將mysql_connect中的帳密,都寫錯,但並沒有跳出錯誤訊息(Invalid query:),是否是towns有哪裡沒注意到?

2. mysql_close 測試
2.1. 當towns將 mysql_close($link_ID); 直接拿掉,測試結果仍不出現任何訊息
2.2. 當towns將 mysql_close($link_ID); 放到第27行下面,查無此人 的文字出現了,但同時也出現了record變數未定義的提醒( Notice: Undefined variable: record)。而且,如果在查詢欄位中打入資料表中存在的資料,該錯誤仍在存在,而且,查無此人的訊息也會出現
2.3. 當towns將 mysql_close($link_ID); 放到第27行下面,出現了link_ID變數未定義的提醒(Notice: Undefined variable: link_ID),並出現了mysql_close警告(Warning: mysql_close() expects parameter 1 to be resource, null given)
2.4. 當towns將 mysql_close($link_ID); 放到第38行下面,則出現了與 2.3. 相同的錯誤

看來towns離有效的存取資料還有一段距離呢 = =||
還是請大大們再指點一下towns,如何解決這些問題 ^^"

補充說明
PHP版本:5.3.3
參考書名:PHP5 動態網頁入門實務 第15-8頁
本篇文章回覆於2013-12-16 15:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
我原本以為是close的問題。所以沒很仔細看。
現在幫你仔細看一下。

我發生你有用isset來做變數存在的判斷。我想這就是問題所在了。
首先先慢慢說問題。

1.在第2行的if (isset($old_name))這段
你拿來做判斷是否有存在$old_name。正常我想你這是要做為判斷是否有post值進去。
可惜你有一點沒注意到。一般的web server如沒特別去設定全域變數模式的話。其post進去的值因該是$_POST['old_name']
而非$old_name這個變數。也就是說,你的$old_name變數不會存在。

2.在來就是你的第27行 if (isset($record))
如果真的發生我上面第1項說的問題。那你這堣]會自然就無$record這個變數存在。
所以自然也就不會有做出任何動作的情況。


解決的方式:
1.close我是可以確定不需要使用。先拿掉。

2.先在你的第37行後,再加上

然後看看是否會出現這段訊息。如果會出現這段訊息的話。那就是我第1項所猜測的沒錯。

3.將剛剛第2項說的拿掉。將第2行的$old_name改成$_POST['old_name']。再試一次看看。
本篇文章回覆於2013-12-17 00:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
不錯的參考

LaLa
檢舉此回應
1.在第一段PHP程式中,towns並無法判斷是否有正常連結資料庫,或是否有正常取得資料庫中的資料,也請大大指導

第4行
$link_ID = mysql_connect("localhost","***","***");
改成
$link_ID = mysql_connect("localhost","***","***") or die("Connect Failure : " . mysql_error());


第11行
$result = mysql_query($str, $link_ID);
改成
$result = mysql_query($str, $link_ID) or die("Query Failur : ".mysql_error()) ;




2. 在第二段PHP程式中,依語法來看,如果打入的人名不存在資料庫中,也該顯示查無此人,但這一段資訊完全沒有顯示,towns不知道生了什麼事,請大大指點

第2行
if (isset($old_name))
請改成
if (isset($_POST["old_name"]))


第8行
$str="SELECT * FROM customers WHERE name ='$old_name';";
請改成:
$str="SELECT * FROM customers WHERE name ='".$_POST["old_name"]."'; ";

建議使用$_POST(form的method使用post),或是$_GET(form的method使用get,或是link所帶的參數),
因為global_register 在php5.3時已不建議使用,並且在php 5.4時已移除了。
當global_register在php.ini裡,被設成on時,就可以直接取用,ex: $old_name;
但若為off時,就要寫出完整寫法,ex: $_POST["old_name"];
一般為求安全性,大都會建議將global_register設為off,在PHP 5.4時,則不再提供這個參數的設定了。


3. Notice: Undefined variable: record
這個只是Notice,可以定義一下$record就可以了。
$record = "";


可以試看看。
本篇文章回覆於2013-12-17 15:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

towns
捐贈 VP 給 towns 檢舉此回應
謝謝星空大的回應,
1. 將第2行改為 if (isset($_POST['old_name']))這樣後,的確出現回應了,下方的查無此人出現了
不過,這麼改後,在第8行就會出現錯誤了 ,主要是因為第8行在取資料庫資料時,還是使用了$old_name變數,只是這一段似乎不能使用$_POST['old_name']取值,請星空大,第8行中資料庫語法該如何改寫

towns目前知道還有另一個方式,就是在第1行下面加入 $old_name = $_POST["old_name"];,先對變數做宣告,這樣也可以達到目地

雖然可以出現查無此人了,但還是查不到資料,towns有空再來試一試,看看為什麼查不到資料 ^^"
本篇文章回覆於2013-12-17 17:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
是的。就如我所說的。這其實並非是mysql的問題。
而是變數的類型。

經由你上面的測試。我可以很確定你的web server並未開全域變數。
一般來說也最好不要開。

養成習慣用$_POST的方式來取得post的值。
第8行是我沒注意看到那邊還有一個。問題還是跟我在第一項說的一樣。你只是沒存在$old_name而造成問題。

其實如果你真不習慣使用$_POST來取得變數名。比較希望用直接的定義變數名的話。
早期我再幫人家改一隻程式。它只能在有開放全域變數的web server下使用的程式碼。
我就幫他在其global.php加上了以下的簡易程式



這樣就可以將POST值轉成實體名變數了。其它GET值還是COOKIE值也可以比照處理
不過說真的。除非像我上面的情況。一個已設計完成的程式碼。不太可能再去修改他的情況下。
我才會不得已用這樣的方式。

正常來說。最好還是養成使用$_POST或$_GET的方式來取值會比較安全。
也比較不會發生程式碼除錯的困難。
本篇文章回覆於2013-12-17 22:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
對了~~第5行的 $$ 我並非是打錯喔。真的要用$$。
之前我曾教過一位用這樣的方式。
他看到這樣的程式碼以為我打錯了。結果錯誤百出。
所以我要特別說一下使用$$是對的。我並非是打錯。
本篇文章回覆於2013-12-17 22:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

towns
捐贈 VP 給 towns 檢舉此回應
謝謝 LaLa大及星空大的回應,towns絕對會習慣使用$_POST或$_GET的陣列取值方式,towns喜歡嚴僅的規格 ^0^
這段程式重點就是在取變數方式的修改,變更後,就會出現 查無此人 的訊息了。towns使用的這本書,都是使用舊的方式取值,towns是有的改了 ^^",不過,也可以做為取值變更的綀習,這也不錯

經過大大們的指點後,這段程式已可正常運作,不過,在查詢列就算打入資料表中有的人名,還是出現 查無此人 ,這個問題很可能是發生在第31、33行,取出陣列資料錯誤造成,towns會再試一試,有問題再請教大大們

補充說明:LaLa大提到的在第2行及第8行加入 or die("Connect Failure : " . mysql_error()); 的確可以有效驗證是否正確,不過,出現的錯誤就是在SSH下使用指令登入資料庫出現的錯誤訊息,這段回應到是有點恐怖,這個錯誤中會將帳號給秀出來,towns乖乖的在$link_ID前面加個 @ ,只讓程式秀出指定的錯誤就好了 ^^
本篇文章回覆於2013-12-18 18:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.