2013-02-04 73 views
0

我想從我有的表單中獲取隱藏的輸入值。除了HIDDEN元素外,表單正確傳遞所有元素。我知道他們被聲明,因爲如果我選擇頁面上的「查看源代碼」,它會向我顯示正確的值(基本上是用戶憑據)。javascript無法從HTML輸入標記分配隱藏的輸入元素

<form name="addExperienceForm" id="addExperienceForm" style="display:none;"> 
       Title:<input type="text" name="title" id="title" /> 
       From:<input type="text" name="startDate" id="startDate" /> 
       To:<input type="text" name="endDate" id="endDate" /> 
       Description:<textarea type="message" name="description" id="description"></textarea> 
       <input type="button" value="Submit" onclick="addUserExp()"/> 
       <input type="hidden" value="<?=$_SESSION['userID']?>" id="userID" /> 
       <input type="hidden" value="<?=$_SESSION['email']?>" id="email" /> 

function addUserExp(){ 

    //get info 
    var title = document.getElementById('title').value; 
    var startDate = document.getElementById('startDate').value; 
    var endDate = document.getElementById('endDate').value; 
    var userID = document.getElementById('userID').value; 
    var email = document.getElementById('email').value; 
    var description = document.getElementById('description').value; 

    //construct POST string with name value pair 
    var str = "title="+title+"start="+startDate+"end="+endDate+"userID="+userID+"email="+email+"desc="+description; 

    //establish XMLHTTP object 
    var req = getXMLHTTP(); 

    if(req){ 

     req.onreadystatechange = function(){ 
      if (req.readyState == 4) { 
       // only if "OK" 
       if (req.status == 200) {       
        document.getElementById('addNewExp').innerHTML=req.responseText;  


       } else { 
        alert("There was a problem while using XMLHTTP:\n" + req.statusText); 
       } 
      } 
     } 
    } 
    req.open("post", "addExperience.php", true); 
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    req.send(str); 
} 

PHP

<?php 


$title = $_POST['title']; 
$startDate = $_POST['start']; 
$endDate = $_POST['end']; 
$userID = $_POST['userID']; 
$email = $_POST['email']; 
$description = $_POST['desc']; 

$sql = "INSERT INTO `user_experience`(`user_id`, `email`, `experience_title`, `experience_desc`, `start_date`, `end_date`) 
      VALUES ('$userID', '$email', '$title', '$startDate', '$endDate', '$description')"; 

echo $sql; 

?> 

我呼應了MYSQL語句,這樣你可以看到,沒有被填充的字段。的上述輸出端產生數據時輸入到表單的情況如下:

INSERT INTO `user_experience`(`user_id`, `email`, `experience_title`, `experience_desc`, `start_date`, `end_date`) VALUES ('', '', 'test', 'Feb-2013', 'May-2013', 'test') 
+0

你確定這些元素的值是由生成表單(查看源代碼)的PHP設置的嗎?你在迴應他們的應該接受他們的PHP,你有沒有嘗試在瀏覽器中回顯他們,然後再發送AJAX查詢以查看JS是否正確讀取了'.value'?假設用戶標識和電子郵件已存儲在會話中,並且處理AJAX的腳本位於同一個PHP實例中,那麼是不是可以在處理AJAX的腳本中使用'$ _SESSION'而不是將它們傳遞給查詢? +1,因爲這不是一個壞問題。 –

回答

3

從一開始我就可以看到一些問題。

(1)<type="text" name="endDate" id="endDate" />

我猜這應該是<input type="text" name="endDate" id="endDate" />

(2)您的輸入沒有name屬性。 id屬性很適合造型和收集價值。但是,只有name屬性被進行提交的表單所識別。

(3)您的表單上沒有method屬性。默認情況下,瀏覽器將使用GET。然而,你期待POST。請將PHP更改爲使用$_GET而不是$_POST或(更好的選項)提供具有method屬性的表單。

幾件事情要謹記(和我的幾個眼中釘):

(1)它總是以指定形式屬性的method一個好主意。瀏覽器的默認設置爲GET,但只有在任何可能跟隨腳步的人都清楚,看到清晰度會很高興。

(2)請,請不要使用PHP <?短標籤。其中一個不清楚,二是它不支持PHP的所有安裝,因爲它基於PHP .ini文件設置,三是它只需要添加三個字符。讓我們不要成爲懶惰的人。

希望這會有所幫助。

+0

此處不需要名稱屬性,此表單的詳細信息正在發佈到JS-AJAX腳本中。 JS腳本然後將這些值傳遞給php腳本。由於GET的字符限制,我被迫使用POST。此外,由於這是與AJAX相關的,因此沒有指定METHOD。正如我所提到的,所有事情都是在隱藏的元素未被傳遞的情況下進行的。 – massimorai

+1

@massimorai這是真的。我很抱歉,我錯過了那個小點子。然而,它仍然是一件好事,因爲表單通常使用'name'屬性。儘管你提出了一個有效的觀點。我對這種混亂表示歉意。 – War10ck

+1

不用擔心 - 我很欣賞你的意見! – massimorai

0
<?php 


$title = $_POST['title']; 
$startDate = $_POST['start']; 
$endDate = $_POST['end']; 
$userID = $_POST['userID']; 
$email = $_POST['email']; 
$description = $_POST['desc']; 

$sql = "INSERT INTO `user_experience`(`user_id`, `email`, `experience_title`, `experience_desc`, `start_date`, `end_date`) 
      VALUES ('$userID', '$email', '$title', '$startDate', '$endDate', '$description')"; 

echo $sql; 

?> 

改變所有$_POST$_GET,你應該通過。

+0

由於GET over POST的字符限制,我無法做到這一點。更何況這是用戶特定的數據應該更安全。 – massimorai

0

你需要添加在你 「名」 ATTR形成

<input type="hidden" name="userID" value="<?=$_SESSION['userID']?>" id="userID" /> 
<input type="hidden" name="email" value="<?=$_SESSION['email']?>" id="email" /> 

你有SQL注入,用途:

array_map('mysql_real_escape_string',$_POST); 
+2

mysql_real_escape_string是不推薦使用的mysql_ *庫的一部分。不要使用它。改用PDO或mysqli。 – Quentin

+0

name屬性在這裏沒有區別。正如我的問題中提到的,唯一不起作用的是隱藏的輸入元素。我將確保使用準備好的SQL語句以避免可能的SQL注入。乾杯! – massimorai

1
  1. 不自己建立一個SQL字符串,用準備好的語句請,會更好的爲您的安全;)
  2. 這將是更好的兼容性原因使用ajax庫(如jQuery)
+0

感謝您的輸入 – massimorai