2013-09-24 89 views
0

我有一个注册表单,允许用户根据需要注册尽可能多的人。例如,我不知道是否有1人正在注册,或者是否有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].")"; 

我查询不工作,所以我知道我的报价和撇号不正确,会有人能告诉我做到这一点的正确方法。任何帮助表示赞赏!

+7

如果您要信任用户不要发布SQL注入代码和不需要的引号,那么您将陷入严重困境。 – bansi

+0

SQL注入资本就在这里。 –

回答

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

更好的方法是使用user0,user1,user2,...而不是使用user0,user1,... 您实际上可以将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个变量的例子,你可以将它们应用到所有其他变量。

干杯。

+0

'mysql_ *'是折旧使用'mysqli_ *'或'PDO' – bansi

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. 使用准备好的语句,而不是直接的查询字符串。
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."')"; 
+0

'mysql_ *'是折旧使用'mysqli_ *'或'PDO' – bansi

+0

同意..更新了答案。 –