2012-05-24 134 views
1

我一直都在上下StackExchange,和大多數互聯網的小網站的聚寶盆,尋找任何很好的理由我的代碼不起作用,但這一個讓我難住。我想顯示特定MySQL表中的總行數,並將計數設置爲變量,以便稍後在腳本中使用。當我運行以下腳本時,腳本死亡,並且我得到一個PHP警告,告訴我mysql_result()期望參數1是資源,字符串給定。mysql_query不返回資源

$conn = mysql_connect('mysql_server', 'username', 'password'); 
if (!$conn) { 
    die('Connect Error ' . mysql_error()); 
} 
mysql_select_db('my_database', $conn); 
if (!mysql_select_db('my_database')) { 
    die('Could not select database: ' . mysql_error()); 
} 
$max_count_query = ("SELECT COUNT(*) FROM table"); 
// Perform Query 
$max_count_action = mysql_query($max_count_query); 
$mcount = mysql_result($max_count_action, 0, 0); 
printf("\nNumber of Records to Process: ", $mcount); 

StackOverflow的集體天才認爲什麼?

在迴應的意見,我有另一個代碼的迷你板提供:

$conn = mysql_connect('127.0.0.1', 'username', 'password'); 
if (!$conn) { 
    die('Connect Error ' . mysql_error()); 
} 
mysql_select_db('my_database', $conn); 
if (!mysql_select_db('my_database')) { 
    die('Could not select database: ' . mysql_error()); 
} 
$max_count_query = ("SELECT COUNT(*) FROM directory_nap"); 
// Perform Query 
$max_count_action = mysql_query($max_count_query); 
if (!$max_count_action){ 
    die('mysql query error: ' . mysql_error()); 
    } 
$mcount = mysql_result($max_count_action, 0, 0); 
if (!$mcount){ 
    die('mysql result error: ' . mysql_error()); 
    } 
printf("\nNumber of Records to Process: ", $mcount); 
+1

你確定括號沒有搞砸嗎? – Sebas

+1

你檢查連接工作,你檢查選擇的數據庫工作,但你不檢查查詢。 – 2012-05-24 22:41:46

+0

嘗試:SELECT COUNT(all)from ... –

回答

4

提供的table tablename只是一個示例(請參閱bitfox的答案),代碼沒有任何問題。我可以在我的測試服務器上使用相同的代碼,並通過將表名更改爲我知道存在於我自己的數據庫中的名稱來獲得結果。

然而,最令人擔憂的是,您指出錯誤說mysql_result() expects parameter 1 to be resource, string given - 如果您的SQL有錯誤,mysql_query返回布爾值(docs),而不是字符串。因此,您要麼沒有顯示與您實際使用的測試代碼相同的測試代碼,要麼您給我們提供了不準確的錯誤消息。

在某些時候,您需要必須將字符串分配給變量$max_count_action。以下是我發送具有故意問題的查詢時得到的結果:Warning: mysql_result() expects parameter 1 to be resource, boolean given - 注意「布爾」,而不是字符串。

所以,我認爲你的第一步是選擇一個不同的表名。也就是說,如果您使用的是保留字作爲表名或列名,你仍然可以通過反引號(')字符周圍的字符串訪問:

SELECT COUNT(*) FROM `table` 

第二步是看發生了什麼$max_count_action把它變成一個字符串。最後,一直使用mysql_error進行調試,但是我建議您對生產代碼做一些比die更好的操作。

// working code on my test server 
$max_count_query = ("SELECT COUNT(*) FROM users"); 
$max_count_action = mysql_query($max_count_query); 
$mcount = $max_count_action ? mysql_result($max_count_action, 0) : 'Error: '.mysql_error(); 
print "\nNumber of Records to Process: ". $mcount; 
+0

我自己對這樣的錯誤深感困惑。在將代碼更改爲上面所示的代碼後,我現在會得到'mysql_result()需要至少2個參數,1給出「......我盡我所能匹配官方文檔的格式,而且我的研究似乎證實了我有,但錯誤仍然存​​在。 – skandalfish

+0

我錯過了mysql_result所需的第二個參數,現在就試試吧。 –

+0

我的跑步代碼與您發佈的內容非常相似,非常感謝!現在看起來好多了。 ;) – skandalfish

1

它很可能是錯誤是在這裏:

SELECT COUNT(*) FROM table 

」是SQL語言的保留字。你應該改變它。

+1

我猜他以此爲例,很多人沒有發佈真正的價值觀,認爲它可能是一種安全風險。 – 2012-05-24 22:44:41

+0

Dagon擁有它。該表實際上稱爲'directory_nap'。不錯,但是。感謝您的快速回復! – skandalfish

+0

好的。別客氣! – bitfox

0

問題中的「表」是代碼中的佔位符還是真實名稱?試着改變你的「表」表的另一個名字,否則我想嘗試mysql_fetch_array,而不是mysql_result

$max_count_query = "SELECT COUNT(*) FROM t"; 
// Perform Query 
$max_count_action = mysql_query($max_count_query) or die (mysql_error()); 
$mcount = mysql_fetch_array($max_count_action); 
printf("\nNumber of Records to Process: ", $mcount[0]); 
1

問題的原因是無法從代碼示例清楚(這可能是一個錯誤的表名,查詢字符串周圍的括號,等等),但是其中有許多不準確的地方。你可以試試下面的代碼,它至少應該解決幾個方面的缺陷,給你的錯誤的詳細信息:

$conn = mysql_connect('mysql_server', 'username', 'password'); 
if ($conn === false) { 
    die('Connect Error ' . mysql_error($conn)); 
} 
if (mysql_select_db('my_database', $conn) === false) { 
    die('Could not select database: ' . mysql_error($conn)); 
} 
$max_count_query = "SELECT COUNT(*) FROM table"; 
// Perform Query 
$max_count_action = mysql_query($max_count_query, $conn); 
if($max_count_action === false) { 
    die('Query error ' . mysql_error($conn)); 
} 
$mcount = mysql_result($max_count_action, 0, 0); 
if($mcount === false) { 
    die('Result retrieval error ' . mysql_error($conn)); 
} 
printf("\nNumber of Records to Process: %s", $mcount); 
mysql_free_result($max_count_action); 

希望這有助於,再見!

0
$conn = mysql_connect('mysql_server', 'username', 'password'); 
if (!$conn) { 
    die('Connect Error ' . mysql_error()); 
} 

這是確定的,但連接和coditional不需要跨越2行

mysql_select_db('my_database', $conn); 

被分裂再次,這是值得商榷的。如果您使用多個數據庫,那麼在SQL中引用數據庫比在PHP代碼中跟蹤狀態要簡單和安全得多。

if (!mysql_select_db('my_database')) { 
    die('Could not select database: ' . mysql_error()); 
} 

你不是已經做到了嗎?

$max_count_query = ("SELECT COUNT(*) FROM table"); 

爲什麼括號?

// Perform Query 

從代碼中不明顯嗎?

$max_count_action = mysql_query($max_count_query); 
$mcount = mysql_result($max_count_action, 0, 0); 

把db句柄傳遞給mysql_query調用會更加簡單。

連接後檢查錯誤,在切換數據庫後檢查錯誤,但在mysql_query()之後不檢查錯誤?

printf("\nNumber of Records to Process: ", $mcount); 

有格式字符串爲mcount argument.Try沒有佔位符:

printf("\nNumber of Records to Process: %d", $mcount); 

I get a PHP warning, telling me that mysql_result() expects parameter 1 to be resource, string given.

那麼你正在運行的代碼是不是你已經證明我們的代碼; mysql_query()不會返回一個字符串。

+1

較少的答案和更多的代碼審查:p –

+0

在我的技能水平,也歡迎代碼審查!我將'$ max_count_action'重命名爲'$ res',並添加了symcbean的佔位符,這似乎解決了問題。我不確定爲什麼以這種方式命名資源會以這種方式影響其可用性。我給了它那個名字,因爲我無法取消設置'$ result' ...還有一些其他查詢進一步向下,並且從所有這些查詢返回的數據是同時需要的。非常感謝大家的慷慨捐助! – skandalfish