2014-07-24 59 views
0

我遇到了一個我似乎無法弄清楚的小問題。用JQuery,Ajax和PHP發佈到SQL

我正在創建一個應用程序,當用戶點擊一個按鈕時,根據他們點擊哪個按鈕,它會在數據庫中發佈一個數字。

有9個數字(0-9),如果他們點擊0,那麼0被放入數據庫中,如果他們點擊1,則1被放入數據庫,等等

我有一個onclick調用使用JQuery和Ajax提交默默的數據:「已提交」

$(function(){ 
    $('#1A').click(function(e) { 
     alert("You clicked 1A"); 
     var poll_ans = 1; 
     $.ajax 
     ({ 
      url: 'postpoll.php', 
      data: {"pollAns": poll_ans}, 
      type: 'post', 
      success: alert("Submitted " + poll_ans) 
     }); 

    }); 
}); 

這工作得很好,當我點擊ID爲1A,我得到警報的DIV,和警報。

但是,它不會發布到SQL數據庫。當我測試postpoll.php文件時,它自己設置URL中的變量,似乎無限期地加載。

這裏是我的代碼:

postpoll.php

<?php 
session_start(); 
$mysqli=mysqli_connect("***","***","***","***"); 
if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

if(isSet($_POST['pollAns'])) 
{ 
$answer=intval($_POST['pollAns']); 
$query = "INSERT INTO test VALUES '$answer'"; 
$result = $mysqli->query($query) or die($mysqli->error.__LINE__); 
} 
?> 

不知道是什麼問題就在這裏 - 我相信,我錯過了一些東西,它可能是一個簡單的解決方案!

另外,一個附註 - 我最終想讓它只能投票一次,最好的方法來完成這個只需設置一個cookie,然後檢查發佈之前該cookie是否存在?我知道他們可以通過清除cookie來規避這種情況,但這不是問題。

SOLUTION: 這似乎是罪魁禍首是CloudFlare。檢查httpd.conf文件後,它顯示sql連接超時。這是因爲我試圖使用通過CloudFlare服務器路由的實際URL連接到數據庫。爲了到達實際的物理服務器,我最終使用了IP。您還可以添加指向IP的DNS記錄,並確保不會通過CloudFlare進行路由。

未來建議行動:請記住,您正在使用CloudFlare!

+0

嘗試「isset」而不是「isSet」,同時在if語句中設置會話。 'if(isset($ _ POST ['pollAns'])){$ _SESSION ['verify'] =「true」; }'然後echo $ _SESSION ['verify']來查看頁面是否連接到sql語句 – DanceSC

+0

您是否嘗試過更改'post'聲明不帶引號,EG'{pollAns:poll_ans}' – Vector

+0

另外:$ result = mysqli_query($查詢); < - 看看是否有效 – DanceSC

回答

0

這似乎是罪魁禍首是CloudFlare。檢查httpd.conf文件後,它顯示sql連接超時。這是因爲我試圖使用通過CloudFlare服務器路由的實際URL連接到數據庫。爲了到達實際的物理服務器,我最終使用了IP。您還可以添加指向IP的DNS記錄,並確保不會通過CloudFlare進行路由。

未來建議行動:請記住,您正在使用CloudFlare!

0

建立連接時,您將其命名爲$con,然後嘗試使用變量$mysqli進行查詢。建立連接時將$con更改爲$mysqli。我還將VALUE更改爲VALUES,並在$answer附近添加了單個括號。

<?php 
session_start(); 
$mysqli=mysqli_connect("***","***","***","***"); // Change from $con to $mysqli 
if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

if(isSet($_POST['pollAns'])) 
{ 
$answer=intval($_POST['pollAns']); 
$query = "INSERT INTO test VALUES '$answer'"; // Add single brackets around $value and changed VALUE to VALUES 
$result = $mysqli->query($query) or die($mysqli->error.__LINE__); // Here you are using $mysqli to perform query 
} 
?> 
+0

啊,這肯定是我的一個重大錯別字 - 但是,由於某種原因,它仍然沒有發佈到數據庫。 –

+0

@Christopher,看看我的新編輯。 – simeg

+0

我的另一個愚蠢的錯字,但仍然不工作*嘆息* –

0

確保您的登錄憑據是正確的。此外,您還沒有正確處理您的ajax請求中的成功和錯誤事件,並提醒您收到錯誤消息。

0

嘗試「isset」而不是「isSet」,同時在if語句中設置會話。 if(isset($ _ POST ['pollAns'])){$ _SESSION ['verify'] =「true」; }然後echo $ _SESSION ['verify']來查看頁面是否進入sql語句。

看看是否改變$ mysqli->查詢($查詢)這個改變任何東西:第一$result = mysqli_query($mysqli, $query);(這不應該,我知道這兩種方式工作)

Also, a side note - I eventually want to make it where the can only vote once, would the best way to accomplish this to simply set a cookie, then check if that cookie is present before posting? I know they could circumvent this by clearing their cookies, but it's not a problem.

您可以檢查表看看是否列出用戶的IP地址:

$sq = "select * from test where IPAddr = '".$_SERVER['REMOTE_ADDR']."'"; 
$qu = mysqli_query($mysqli,$sq); 
// if it does then the mysqli_num_rows will return 1 or greater. 
if (mysqli_num_rows($qu) == 0) { 
    $query = "Insert into"... 
} 
+0

只有IP地址的問題是它即使在大多數人都會連接到手機上的無線網絡的情況下。所以每個人的IP都是一樣的。 順便說一句,我修復了最初的問題,這是由於CloudFlare - 我經常忘記它已啓用。 –

+0

啊好吧,你讓他們登錄?然後,您可以檢查他們的登錄會話以取代遠程地址 – DanceSC

+0

沒有登錄 - 我正在考慮讓發言人有一個PHP頁面,他們可以開始一個獨特的會話,然後當客戶端進入頁面時,他們將抓取當前會話,然後發佈到數據庫。另外,如果他們點擊另一個按鈕,它將刪除他們的最後一個答案,並通過在數據庫中插入他們的新答案來更新它。這樣,每當揚聲器開始一個新的會話時,它將是一個不同的數據庫。我可以讓每個表都有一個用於sessionID,ClientID和一列的答案。仍然試圖在我的腦海中解決它。你怎麼看? –