2010-01-16 66 views
1

我試圖學習,我卡住了。我不明白爲什麼這不起作用。如果我只是離開包含和刪除函數調用,並不包含數據庫連接在一個函數中它正常工作。PHP mysql_query錯誤

我在這裏失蹤的是什麼?

錯誤消息:

警告:請求mysql_query():提供的參數不是在/home3/badamsne/public_html/views/dogs.php一個有效的MySQL-Link的資源上線24 數據庫查詢失敗:

網頁代碼:在單獨的文件

<?php 
    include("../model/db_conn.php"); 

    db_conn(); 
?> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title></title> 
</head> 
<body> 
    <?php 



    // 3. Perform database query 
    $result = mysql_query("SELECT * FROM dogs", $connection); 
    if(!$result) { 
     die("Database query failed: " . mysql_error()); 
     } 

    // 4. Use returned data 
      while ($row = mysql_fetch_array($result)) { 
       echo $row[0]." ".$row[1]."<br />"; 
      } 
    ?> 
</body> 
</html> 
<?php 
// 5. Close connection 
    mysql_close($connection); 
?> 

PHP函數:

<?php 

function db_conn() { 

    // 1. Create database connection 
    $connection = mysql_connect("localhost","website_admin","[email protected]"); 
    if(!$connection) { 
     die("Database connection failed: " . mysql_error()); 
     } 

    // 2. Select a database to use 
    $db_select = mysql_select_db("website_db", $connection); 
    if(!$db_select) { 
     die("Database selection failed: " . mysql_error()); 
     } 
} 
?> 

謝謝! Tom

+0

我不能說如何,但你的$連接變量有問題。無論如何,PHP都會保留全局連接對象;也許你可以從mysql_query調用中刪除這個變量,因爲它是不需要的。 '$ result = mysql_query(「SELECT * FROM dogs」);' – zneak 2010-01-16 00:48:48

+0

$連接沒有問題,它只是不在同一個範圍內;) – svens 2010-01-16 00:52:50

+0

不要,使用mysql_ *接口。切換到mysqli或PDO。它在最新的PHP版本中已被棄用。 – 2017-06-05 01:43:58

回答

4

您永遠不會從您的函數返回$連接,也不會將其捕獲爲頂級文件中的變量。

更改此:

<?php 
include("../model/db_conn.php"); 

db_conn(); 

>

這樣:?

<?php 
include("../model/db_conn.php"); 

$connection = db_conn(); 

>

並添加

return $connection; 

您的功能。

+0

這個變量的「行爲」可以在http://docs.php.net/language.variables.scope – VolkerK 2010-01-16 00:49:44

+0

解釋,這是正確的。我忽略了這一點。 – zneak 2010-01-16 00:49:47

0

你的問題在於,$ connection變量不是全局變量。這意味着它僅在函數db_conn()的上下文中「可見」,而不在主程序中。

有你的問題,有三種簡單的解決方案:

  1. 添加 '全球$連接;'作爲你的函數的第一個命令。
  2. 如果您剛打開一個連接,則不必爲mysql_query函數提供MySQL連接資源。所以'mysql_query(「SELECT * FROM dogs」);'也可以工作。
  3. 您也可以從函數中返回$ connection變量。
0

它看起來像$connection被創建爲db_conn()函數的局部變量。你可以宣佈它的全球,這樣其他的代碼可以訪問它:

function db_conn() 
{ 
    global $connection; 

    $connection = mysql_connect(...); 

} 

// now $connection is available everywhere 

注:大多數編程語言有關於濫用全局變量的警告。參見W.A.Wulf和M.Shaw的Global Variables Considered Harmful(ACM SIGPLAN,1973)。

+0

你達人比爾!非常感謝您的幫助。 – Tom 2010-01-16 06:12:33