0

我有一个注册表单,允许用户注册任意数量的人。例如,我不知道是否有 1 人在注册或 500 人在注册。$_POST['first0'] $_POST['first1']因此,在服务器端,如果我有 3 个人同时注册,我需要通过and访问一个人的所有名字$_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

4 回答 4

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],
    ));
}
于 2013-09-24T05:13:49.387 回答
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."')";
于 2013-09-24T04:37:14.790 回答
1

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

<!-- 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 个变量的示例,您可以将它们应用于所有其他变量。

干杯。

于 2013-09-24T04:00:52.580 回答
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. 使用准备好的语句而不是直接查询字符串。
于 2013-09-24T04:25:17.473 回答