2012-07-28 101 views
0

我正在嘗試使用jquery函數編寫一條新記錄。插入不工作在MYSQL

$.post("insertuser.php",$("#rohanStart").serialize(),function(data){ 
    alert(data); 
}); 

這似乎工作,我確實得到了與echo'ed statmenet警報。問題是這些值沒有寫入數據庫。查詢聲明中有錯嗎?

mysql_query("INSERT INTO ajax_demo1(FirstName,LastName,Unit,Group,photo) 
     VALUES (
      '".$arr['FirstName']."', 
      '".$arr['LastName']."', 
      '".$arr['Unit']."', 
      '".$arr['Group']."', 
      '".$arr['photo']."' 
     )"); 

echo $arr['Group']; 
+0

將其縮小到客戶端和Web服務器(AJAX部分)之間的通信或Web服務器和數據庫(MySQL部分)之間的通信。這樣做涉及基本的調試技術;使用它們。 – tdammers 2012-07-28 23:36:42

+0

做一個'print_r($ arr);' – 2012-07-28 23:38:57

+2

另外,你直接在你的查詢中插入變量。這是不可原諒的 - 它爲SQL注入打開了各種各樣的大門,而且它也顯然是錯誤的(如果某人的姓是「O'Brien」,那麼會發生什麼?)。瞭解參數化查詢並使用它們(提示:'mysql_XXXX' API不提供它們,您需要切換到'mysqli'或PDO)。如果做不到這一點,你至少可以在你的變量上運行'mysql_real_escape_string',然後將它們插入到查詢中。這不是防彈的,但它是一些東西。 – tdammers 2012-07-28 23:39:44

回答

1

先不要使用jQuery或任何框架,它們依賴於專有的Microsoft JScript中的innerHTML的方法,它不與DOM因此腳本添加歧義的鉅額正常工作。

其次,你不正確地逃避進入數據庫的數據,這是一個嚴重的安全問題。

第三,您的數據庫查詢方法沒有考慮錯誤處理,您只是直接在查詢中拋出查詢,並希望獲得最佳結果。

您應該始終編號您的查詢,並附上他們,因爲我有以下。請注意,除了錯誤之外,最好先使條件失敗,但是如果數據庫結構是首先成功執行的,然後THEN無法增加縮進(通過單個空間而不是此選項卡浪費,那麼您有五個屏幕可以水平滾動)你可以直觀地看到自己在自己的代碼中。

$query1 = "SELECT * FROM table_name WHERE something='value'"; 
$result1 = mysql_query($query1); 

if ($result1) 
{ 
$row1 = mysql_fetch_assoc($result1); 
} 
else {mysql_error_report($query1,mysql_error(),__FUNCTION__);} 

如果你的主標題包括(你有被列入除外AJAX正確的所有請求主標題?),你應該有一個可以用來登錄SQL錯誤通用的MySQL錯誤處理功能。

以下是通用數據庫錯誤處理程序。對於HTTP,JavaScript,PHP和SQL錯誤,您應該有管理錯誤日誌,以便您可以查看和更正訪問者遇到的問題,而不是僅僅給您帶來不便。

function mysql_error_report($q,$e,$f) 
{ 
if (isset($_SESSION['database'])) 
{ 
    if (isset($_SESSION['id_member'])) {$id = $_SESSION['id_member'];} else {$id = 0;} 
    if (isset($_SESSION)) {$session = mysql_real_escape_string(session_id());} else {$session = 0;} 
    $ip = mysql_real_escape_string(getenv('REMOTE_ADDR')); 

    $query = mysql_real_escape_string($q); 
    $error = mysql_real_escape_string($e); 
    $function = mysql_real_escape_string($f); 
    if (isset($_SESSION['type'])) {$type = mysql_real_escape_string($_SESSION['type']);} else if (isset($_SESSION['cms_browser'])) {$type = 'Browser';} else {$type = 'Unknown';} 
    if (isset($_SERVER['REQUEST_URI'])) {$url = $_SERVER['REQUEST_URI'];} else {$url = '';} 
    if (isset($_SERVER['HTTP_USER_AGENT'])) {$ua = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);} else {$ua = '';} 

    $query1 = "INSERT INTO log_errors_sql (id_session, type, id_user, date, ip, function, mysql_error, mysql_query, url, user_agent) VALUES ('$session', '$type', '$id', NOW(), INET_ATON('$ip'), '$function', '$error', '$query', '$url', '$ua')"; 
    $result1 = mysql_query($query1); 

    if (!$result1) {mysql_error_report_mail($q,$e,$f,$ua);} 
} 
else {mysql_error_report_mail($q,$e,$f);} 
} 

通過使用該方法,您將加強您的編碼實踐,使其更嚴格。你不需要模棱兩可,你希望成爲你的代碼的總稱,因爲你的代碼中的主觀性越低,你的代碼就能處理得越多。

此外你的空間非常寬鬆。

這...

INSERT INTO ajax_demo1(FirstName,LastName,Unit,Group,photo) 

的格式應該是這樣的...

INSERT INTO ajax_demo1(FirstName, LastName, Unit, Group, photo) 

你可能會問,爲什麼讓你的白色空間這樣是很重要的,如果你沒有花大量的時間用查找和替換(查找「高級查找&替換」,它適用於wine/Linux,並且將本來的Linux控制檯命令的性能吹捧爲廢話,它很便宜,支持正則表達式等)你會發現自己在眨眼之間進行大規模的網站編輯因爲即使你的白色空間也是一樣嚴格的方法。

如果您留意我的建議,請使用AFR(高級查找和替換)來搜索(但不能替換)「mysql_query」的所有實例,並更正所寫內容的格式。混合一點AJAX通知,你可以在瀏覽器中看到錯誤,而不需要一個alt-tab。這就是我滾動的方式。

......當然,這樣做會讓你的調試更容易。這不是魚,這是釣魚,我希望它有幫助。

+0

感謝您的詳細回覆。我需要所有幫助:)我將致力於解決安全問題。現在我意識到該組是一個保留關鍵字。當我將數據庫列標題更改爲RGroup時,它開始工作:) – rohan 2012-07-29 05:21:10