脚本化$ _POST变量即时

时间:2013-09-24 03:55:48

标签: php mysql string

我有一个注册表单,允许用户注册尽可能多的人。例如,如果一个人正在注册或者有500人,我提前不知道。所以在服务器端,如果我有3个人同时注册,我需要通过$_POST['first0'] $_POST['first1']$_POST['first2']访问一个人的所有名字。所以这是我的数据库查询。

    for ($i=0; $i < runners; $i++) {
        $query = "INSERT INTO ".$usertable." VALUES (".$_POST['first'.$i].", ".$_POST['last'.$i].", ".$_POST['age'.$i].",
        ".$_POST['gender'.$i].", ".$_POST['email'.$i]." , ".$_POST['phone'.$i]." , ".$_POST['address'.$i]." ,
        ".$_POST['city'.$i]." , ".$_POST['state'.$i]." , ".$_POST['zip'.$i]." , ".$_POST['type'.$i]." , ".$_POST['tshirt'.$i].")";

我的查询无效,所以我知道我的引号和撇号是不正确的,任何人都可以告诉我正确的方法来实现这一点。任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:2)

首先,如果您的表单条目使用数组语法,则发布的数据更容易使用,即:

<label>First: <input name="first[]" value="" /></label>
<label>Last: <input name="last[]" value="" /></label>
<label>Age: <input name="age[]" value="" /></label>
<label>Gender: 
    <input type="radio" name="gender[]" value="m" />Male
    <input type="radio" name="gender[]" value="f" />Female
</label>

然后,在您的代码中,$_POST['first']之类的值是一个值数组。

其次,你应该看看准备好的陈述。观察:

$stmt = $db->prepare('INSERT INTO mytable (first, last, age, gender) VALUES (?, ?, ?, ?)');

foreach ($_POST['first'] as $index => $value) {
    $stmt->execute(array(
        $value,
        $_POST['last'][$index],
        $_POST['age'][$index],
        $_POST['gender'][$index],
    ));
}

答案 1 :(得分:1)

更好的方法是使用user0,user1,user2,... 您实际上可以将html输入文本作为数组传递。 e.g:

<!-- first user field -->
<input type="text" name="users[]" />
<!-- second user field -->
<input type="text" name="users[]" />
<!-- third user field -->
<input type="text" name="users[]" />

所以你的php看起来像这样:

$users = $_POST['users'];
foreach ($users as $user) {
    insertQuery = "INSERT INTO $userTable VALUES ('".mysqli_escape_string($user)."');
}

当然上面的代码只是一个带有1个变量的例子,你可以将它们应用到所有其他变量。

干杯。

答案 2 :(得分:1)

首先,您应该在与数据库交互时阻止SQL注入。

使用mysqli_real_escape_string。这是更新的查询。

 for ($i=0; $i < runners; $i++) {
         $firstname = mysqli_real_escape_string($_POST['first'.$i]);
         $lastname = mysqli_real_escape_string($_POST['last'.$i]);
         $age = mysqli_real_escape_string($_POST['age'.$i]);
         $gender = mysqli_real_escape_string($_POST['gender'.$i]);
         $email = mysqli_real_escape_string($_POST['email'.$i]);
         $phone = mysqli_real_escape_string($_POST['phone'.$i]);
         $address = mysqli_real_escape_string($_POST['address'.$i]);
         $city = mysqli_real_escape_string($_POST['city'.$i]);
         $state = mysqli_real_escape_string($_POST['state'.$i]);
         $zip= mysqli_real_escape_string($_POST['zip'.$i]);
         $type= mysqli_real_escape_string($_POST['type'.$i]);
         $tshirt= mysqli_real_escape_string($_POST['tshirt'.$i]);

        $query = "INSERT INTO ".$usertable." VALUES ('".$firstname."', '".$lastname ."', ".$age .",
       '".$gender ."', '".$email ."', ".$phone." , '".$address ."' ,
        '".$city."' , '".$state."' , ".$zip." , '".$type."' , '".$tshirt."')";

答案 3 :(得分:0)

正如@plain jane所说,你错过了很多单引号。 您可以使用PHP的变量替换功能,如下所示。这是更易读的代码。

$query = "INSERT INTO $usertable VALUES ('{$_POST['first'.$i]}', '{$_POST['last'.$i]}', '{$_POST['age'.$i]}',
    '{$_POST['gender'.$i]}', '{$_POST['email'.$i]}', '{$_POST['phone'.$i]}', '{$_POST['address'.$i]}' ,
    '{$_POST['city'.$i]}' , '{$_POST['state'.$i]}' , '{$_POST['zip'.$i]}' , '{$_POST['type'.$i]}' , '{$_POST['tshirt'.$i]}')";

警告:您的代码很容易受到SQL注入攻击,只需在任何已发布字段中使用单引号即可轻松破解。即使St'Mary作为名字也会破坏您的代码。为了防止这种情况

  1. 请验证/清理您发布的值
  2. 使用Prepared语句而不是直接查询字符串。