javascript无法从HTML输入标记分配隐藏的输入元素

时间:2013-02-04 16:24:59

标签: php javascript mysql ajax

我试图从我拥有的表单中获取隐藏的输入值。表格适当地传递所有元素,除了HIDDEN元素。我知道他们被宣布是因为如果我选择"查看来源"在页面上它显示正确的值(基本上是用户凭据)。

<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') 

4 个答案:

答案 0 :(得分: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文件设置而且还有三个,你只需添加三个字符。让我们不要懒惰。

希望这有帮助。

答案 1 :(得分:1)

  1. 不要自己构建那个sql-string,请使用预先准备好的语句,以便更好地保护你的安全;)
  2. 出于兼容性原因,最好将库用于ajax(如jquery)

答案 2 :(得分: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,您应该通过。

答案 3 :(得分:0)

您需要在表单中添加“name”attr

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

你有sql-injection,使用:

array_map('mysql_real_escape_string',$_POST);