2013-05-29 43 views
0

我有一個表vieweridipdate_last_viewed & blog_id作爲列。我首先檢查具有相同IP和blog_id的特定條目是否存在。如果是,它會更新日期。否則,它會插入一個新條目。選擇和更新不工作

我的代碼如下:

$search_ip = mysql_query("SELECT ip FROM viewer WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND blog_id= '".$b_id."' "); 

if ($search_ip == false){ 
    $insert_ip = mysql_query("INSERT INTO viewer (ip, blog_id, date_last_viewed) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$b_id."', NOW())"); 
} 
else { 
    $update_ip = mysql_query("UPDATE viewer SET date_last_viewed = NOW() WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND blog_id='".$b_id."' ");   
} 

表不插入任何內容。我在這裏做錯了什麼?另外,由於我是PHP編程新手,有人能告訴我如何將上面的代碼修改爲PDO嗎?

+0

那麼,你做錯了一件事是不檢查你的任何查詢工作 - 在最後添加一個或死(mysql_error())',你會看到錯誤是什麼。 – andrewsi

+0

mysql_query不返回布爾值。 – Robert

+0

不要使用'myql_ *'函數。改用它們的對象版本。 – Kasyx

回答

1

您應該首先添加錯誤處理程序。然後移至mysqli_並使用預準備語句。

$search_ip = mysql_query("SELECT ... ") or die(mysql_error()); 

if(mysql_num_rows($search_ip) == 0) { 
    $insert_ip = mysql_query("INSERT ... ") or die(mysql_error()); 
} 
else { 
    $update_ip = mysql_query("UPDATE ... ") or die(mysql_error()); 
} 
2

假設您的mysql_query正確執行,它不會返回false。你應該做的是檢查它返回的行數。你可以使用mysql_num_rows來做到這一點。

此外,請注意mysql_*手冊頁頂部的大紅色警告框。

5

你可以在一個查詢中做到這一點。

MySQL有一個叫做INSERT ... ON DUPLICATE KEY UPDATE的特殊功能,它基本上在記錄不存在的情況下插入或者如果它已經存在則更新。你需要做的一件事是根據你的語句來定義一個唯一的列(/秒)

,您需要定義上都列上的唯一約束,

ALTER TABLE viewer ADD CONSTRAINT vw_uq UNIQUE (ip, blog_id) 

和執行該語句,

INSERT INTO viewer (ip, blog_id, date_last_viewed) 
VALUES ($_SERVER['REMOTE_ADDR'], b_id, NOW()) 
ON DUPLICATE KEY UPDATE date_last_viewed = NOW() 

作爲旁註,如果變量的值(s)來自外部,則該查詢容易受到影響,其格式爲SQL Injection。請看下面的文章,瞭解如何防止它。通過使用PreparedStatements你可以擺脫使用單引號圍繞值。

0

這不是正確的方式來檢查,如果查詢返回的值:

$search_ip = mysql_query("SELECT ip FROM viewer WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND blog_id= '".$b_id."' "); 

if (mysql_num_rows($search_ip)==0) { 
.... 
} 
1

$search_ip永遠不會== false,因爲它是對結果的參考。改爲使用mysql_num_rows($earch_ip)。另外請注意,mysqli取代了這一點,你的代碼實際上已被棄用