2010-03-23 110 views
1

原始文本中刪除SQL查詢不能正常運行 - 沒有錯誤消息

好了,我才發現,原來多虧有幫助的答案的問題。 它列出「無效的查詢:沒有選擇數據庫」作爲錯誤。

require_once ('../dir_connect.php');    

$dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
     if (!$dbc) { 
      die('Could not connect: ' . mysql_error()); 
     } 

如果我有這樣的,我有這樣的dir_connect.php文件:

/** The name of the database */ 
define('DB_NAME', 'unlisted_employees'); 

/** MySQL database username */ 
define('DB_USER', 'unlisted_qpass'); 

/** MySQL database password */ 
define('DB_PASSWORD', 'testpass'); 

/** MySQL hostname */ 
define('DB_HOST', 'localhost'); 

有什麼我需要添加到您的實際的數據庫連接?

+1

您錯過了參數化查詢,有一件事... – Aaronaught 2010-03-23 01:56:21

回答

4

您需要檢查mysql_query()調用的返回值。

http://php.net/manual/en/function.mysql-query.php

$result = mysql_query($query); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 

現在,你永遠不會真正擊中了錯誤條件並不會真正看到什麼(如果有的話)的錯誤是,MySQL正在發回給你。

另外,您可能想要轉義您插入查詢的值,而不是僅執行正常字符串連接。如果你不這樣做,你的應用程序可能容易受到SQL注入攻擊。這裏是如何安全地生成查詢:

$query = sprintf("INSERT INTO staff (name, lastname, username, password, position, department, birthmonth, birthday, birthyear, location, phone, email, street, city, state, country, zip, tags, photo) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
       mysql_real_escape_string($name), 
       mysql_real_escape_string($lastname), 
       mysql_real_escape_string($username), 
       mysql_real_escape_string($password), 
       mysql_real_escape_string($position), 
       mysql_real_escape_string($department), 
       mysql_real_escape_string($birthmonth), 
       mysql_real_escape_string($birthday), 
       mysql_real_escape_string($birthyear), 
       mysql_real_escape_string($location), 
       mysql_real_escape_string($phone), 
       mysql_real_escape_string($email), 
       mysql_real_escape_string($street), 
       mysql_real_escape_string($city), 
       mysql_real_escape_string($state), 
       mysql_real_escape_string($country), 
       mysql_real_escape_string($zip), 
       mysql_real_escape_string($tags), 
       mysql_real_escape_string($photo)); 

編輯:剛剛看到您的評論到另一個答案。如果您已經在進行轉義,如:

$birthday = mysql_real_escape_string(trim($_POST['birthday'])); 

那麼您在生成查詢時不需要轉義它。在生成查詢時進行轉義可能是更好的做法,因此顯然你不會錯過任何東西。

編輯2:根據文檔,mysql_connect()應該接受主機,用戶和密碼,然後您需要執行mysql_select_db()調用以選擇正確的數據庫。

http://www.php.net/manual/en/function.mysql-select-db.php

$dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); 
if (!$dbc) { 
    die('Could not connect: ' . mysql_error()); 
} 

// make foo the current db 
$db_selected = mysql_select_db(DB_NAME, $dbc); 
if (!$db_selected) { 
    die ('Could not select database: ' . mysql_error()); 
} 

(順便說一句,你應該修改你的問題,並放回原來的文本,所以可能是其他後來發現這個話題有用!)

+0

無效的查詢:No selected selected 糟糕?我會仔細檢查發生的情況。 – 2010-03-23 02:07:58

0

您應該使用類似mysql_real_escape_string(或適用於您的數據庫引擎的任何內容)來轉義查詢中的參數。查看我鏈接到的文檔。自從我使用PHP以來已經有一段時間了,但是有人可能會用更好的參數化轉義方法來嵌入。

但是,你的主要問題似乎是你插入字符串到整數字段。檢查你的zip,birthmonth,生日,birthyear等字段的值......他們可能不需要用單引號轉義。

祝你好運!

+0

謝謝!我會仔細研究這一點。我不確定我是否明白它是如何工作的。我是這個escape_string的新手,但是我在上面這樣使用它; $ birthday = mysql_real_escape_string(trim($ _ POST ['birthday'])); 有沒有更好的方法來做到這一點? – 2010-03-23 02:03:51

0

沒有連接到數據庫?

mysql_query()在失敗時返回false並生成警告,而不是錯誤。

順便說一句,!$query不會告訴你任何事情,只要是mysql,因爲它只是一個文本字符串。

0

的問題是在這裏:

if (!$query) { 
    die('Invalid query: ' . mysql_error()); 
} 

正在檢查的$query變量來決定,如果查詢運行與否,這是沒有意義的。相反,您需要收集mysql_query的返回值,然後改爲使用它。

$res = mysql_query($query); 
if (!$res) { 
    die('Invalid query: ' . mysql_error()); 
}