我有一个注册表单,允许用户注册尽可能多的人。例如,如果一个人正在注册或者有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].")";
我的查询无效,所以我知道我的引号和撇号是不正确的,任何人都可以告诉我正确的方法来实现这一点。任何帮助表示赞赏!
答案 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
作为名字也会破坏您的代码。为了防止这种情况