2010-04-23 62 views
0

我的代碼如下:數據庫插入不會發生

<?php 
include("config.php"); 

$ip=$_SERVER['REMOTE_ADDR']; 

if($_POST['id']) 
{ 
    $id=$_POST['id']; 
    $id = mysql_escape_String($id); 

    $ip_sql=mysql_query("select ip_add from Voting_IP where mes_id_fk='$id' and ip_add='$ip'"); 
    $count=mysql_num_rows($ip_sql); 

    if($count==0) 
    { 
     $sql = "update Messages set up=up+1 where mes_id='$id'"; 
     mysql_query($sql); 

     $sql_in = "insert into Voting_IP (mes_id_fk,ip_add) values ('$id','$ip')"; 
     mysql_query($sql_in) or die(mysql_error()); 
     echo "<script>alert('Thanks for the vote');</script>"; 


    } 
    else 
    { 
     echo "<script>alert('You have already voted');</script>"; 
    } 

    $result=mysql_query("select up from Messages where mes_id='$id'"); 
    $row=mysql_fetch_array($result); 
    $up_value=$row['up']; 
    echo "<img src='button.png' width='110' height='90'>"; 
    echo $up_value; 

} 
?> 

我的問題是,在插入過程中不會發生的。 script標籤回顯一個警告框。即使是img標籤也會回傳到網頁上。但插入過程不會發生。配置文件很好。 注意:此代碼適用於具有PHP 5.3的本地計算機,但不適用於具有PHP 5.2的服務器。

+0

愚蠢的問題,但你成功地連接到在這兩種情況下的分貝?該代碼未在此顯示。 – Tom 2010-04-23 13:49:50

+0

是的,我成功了..再次,代碼在我的本地服務器上正常工作..但沒有在我的wwebserver上工作 – reggie 2010-04-23 13:57:29

+0

但是,你看到數據庫中的新值嗎? – mck89 2010-04-23 14:00:44

回答

0

唯一的解釋是$count==0檢查是錯誤的。嘗試用以下解決方法:

$ip_sql=mysql_query("select count(*) from Voting_IP where mes_id_fk='$id' and ip_add='$ip'"); 
$rc=mysql_fetch_row($ip_sql); 
$count=$rc[0]; 

代替:

$ip_sql=mysql_query("select ip_add from Voting_IP where mes_id_fk='$id' and ip_add='$ip'"); 
$count=mysql_num_rows($ip_sql); 
+0

計數條件正常工作,因爲我得到以下警報: echo「「;正如你所看到的, ,上面的警報在if條件內,就在insert語句的下面。 – reggie 2010-04-23 13:50:37

+0

然後它的插入查詢沒有其他可能性 – mck89 2010-04-23 13:52:42

+0

因此,執行進入if count = 0代碼。 – reggie 2010-04-23 13:53:23

0

您是否嘗試過用引號亂搞?有人請糾正我,如果我錯了,但AFAIK,單引號內的變量不會在PHP中擴展。

$ip_sql=mysql_query("select ip_add from Voting_IP where mes_id_fk='".$id."' and ip_add='".$ip."'"); 
+0

它們是雙引號內的單引號,所以沒有問題,但引號問題頻繁出現,因此它可以是解決方案 – mck89 2010-04-23 14:14:14

+0

幾乎就是 - $ str ='Hello $ planet '不會輸出$ planet變量的值,而是「Hello'$ planet'」應該。請注意,字符串在第一個示例中被單引號包圍,這意味着最小解析,第二個示例包含一些單引號,但被雙引號包圍,這意味着完全解析(包括變量的翻譯)。 – Fenton 2010-04-23 14:14:24

+0

雙引號內的單引號被視爲與任何其他字符一樣,所以如果$ a if 1,「'$ a'」是'1' – Fluffy 2010-04-23 14:16:53

0

縱觀答案和意見,是時候讓老同學:

你要買什麼?

你正在爲$ id和$ ip賦值 - 可能其中一個是空的或者包含一個字符,以某種方式使結果「奇怪」。仔細看看你即將執行的原始查詢,你會看到它的變量部分是否令人不安。

+0

ok ..將盡快嘗試 – reggie 2010-04-23 14:20:38

0

如果第一個查詢成功你不檢查:

$ip_sql=mysql_query("select ip_add from Voting_IP where mes_id_fk='$id' and ip_add='$ip'"); 
$count=mysql_num_rows($ip_sql); 

有沒有... or die(mysql_error())那裏,但是這是最有可能不是問題,因爲如果查詢失敗,你會得到一個「無效語句句柄「類型錯誤,當您之後立即執行mysql_num_rows()調用時。作爲一種文體的文章中,我會建議重寫第一個查詢,如下所示:

SELECT COUNT(*) FROM Voting_IP 
WHERE (mes_id_fk = $id) AND (ip_add = $ip) 

您沒有使用任何檢索值,只是行計數的,所以不應該做沒有意義「SELECT *」類型查詢,這會強制數據庫對所有可能的值執行至少一些處理。如果這個系統擴展到非常大量的投票和IP,使用count()版本將會更有效率。

你說插入不發生,但不要說發生哪個alert(),這意味着要麼插入查詢出錯,要麼你的第一個查詢返回0,並且插入查詢的整個塊是跳過。

您是否嘗試過手動運行更新/插入查詢?您不檢查更新是否成功,因爲之後沒有or die(mysql_error())。也許有外鍵錯誤,語法錯誤等...

0

如果你正在更新基於ID的條目,那麼顯然你想更新並插入時,計數是不是零....或大於零,..或1

只需取出== 0,應該修復它

if($count) 
{ 
    $sql = "update Messages set up=up+1 where mes_id='$id'"; 
    mysql_query($sql); 

    $sql_in = "insert into Voting_IP (mes_id_fk,ip_add) values ('$id','$ip')"; 
    mysql_query($sql_in) or die(mysql_error()); 
    echo "<script>alert('Thanks for the vote');</script>"; 


} 
相關問題