0

我正在制作我的第一个数据库,并且正在使用一个表来包含 php/mysql 调查中的所有响应。然而,响应发布到一个表中,但在三个不同的行中。我怀疑这与为三部分响应执行 3 次的查询有关。我需要连接这个吗?如果需要,如何连接?有没有别的解决办法。

这是 HTML 表单:

<html>
<?php include 'C:\xampp\htdocs\paxdb\head.php'; 
include 'config/menu.php';?> 
<div id="dataentry">

<!--This section is the demographic text field area-->
<form method="post" action="dataentered.php">
First Name:&nbsp;<input type="text" name="First_Name"/></br>
</br>
Last Name:&nbsp;<input type="text" name="Last_Name"/></br>
</br>
E-mail:&nbsp;<input type="text" name="email"/></br>
</br>

<!--This section is the age range checkbox selection area-->
<p><u><b>Age Range</b></u></p>
<input type="checkbox" name="age[]" id="20-25" value="20-25"/>&nbsp;20-25</br>
<input type="checkbox" name="age[]" id="26-30" value="26-30"/>&nbsp;26-30</br>
<input type="checkbox" name="age[]" id="31-35" value="31-35"/>&nbsp;31-35</br>
</div>
<div id="checkboxes">
</div>

<!--This section is the trips take checkbox area-->
<div id="tripstodatetype">
<p><u><b>WHAT TYPE OF TRIPS TO DATE HAVE YOU TAKEN?</b></u></p>
<input type="checkbox" name="trip2date[]" id="Bus" value="Bus">&nbsp;Bus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</br>
<input type="checkbox" name="trip2date[]" id="Car" value="Car">&nbsp;Car</br>
<input type="checkbox" name="trip2date[]" id="Weekend fly-in" value="Weekend fly-in">&nbsp;Weekend fly-in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</br>
</div>
<div id="tripstodateborder">
</div>

<!--This section is the type of trip client likes best checkbox area-->
    <div id="triplikebest">
<p><u><b>WHAT TYPE OF TRIP DO YOU LIKE BEST?</b></u></p>
<input type="checkbox" name="triplikebest[]" value="Bus">&nbsp;Bus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</br>
<input type="checkbox" name="triplikebest[]" value="Car">&nbsp;Car</br>
<input type="checkbox" name="triplikebest[]" value="Weekend fly-in">&nbsp;Weekend fly-in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</br>
</div>
<div id="triplikeborder">
</div>

和相应的PHP:

<html>
<?php
include 'head.php';
include 'config/menu.php'; 
$host="localhost";
$username="someusername";
$password="somepass";
$dbname="somedb";

$dbc = mysql_connect($host, $username, $password, $dbname);
if (!$dbc)
{
    die('Error connecting to MySQL server' . mysql_error());
    }
mysql_select_db($dbname, $dbc);

//send user data to the database table
$first_name=$_POST['First_Name'];   
$last_name=$_POST['Last_Name'];
$email=$_POST['email'];

mysql_query("INSERT INTO pax (First_Name, Last_Name, email)
VALUES('$first_name','$last_name','$email')"); 

//send age data to the database table
$age = $_POST['age'];
$my_range = "";
foreach($age as $range) 
$my_range = $my_range . $range . " ";
mysql_query("INSERT INTO pax(age) VALUES ('$my_range')") or die (mysql_error()); 

//send trip to date data to the database table
$trip2date = $_POST['trip2date'];
$my_triprange = "";
foreach($trip2date as $triprange) 
$my_triprange = $my_triprange . $triprange . ", ";
mysql_query("INSERT INTO pax(trip2date) VALUES ('$my_triprange')") or die (mysql_error()); 


mysql_close($dbc);
?>

非常感谢您的帮助。

4

3 回答 3

2

...您正在运行 3 个 INSERT 查询。我认为您严重误解了您要达到的目标。您可能想要连接“trip2date”参数的值,或者最好在另一个表中插入多条记录(查看基本的关系数据库使用情况)。

另外,为什么用户可以选择多个年龄范围?一个人怎么可能同时是 20-25 和 26-30?您可能希望在那里有一个广播组,因此他们只能选择一个选项。(同样,您也可能在其中插入多行;如果用户勾选所有三个年龄范围(您允许他们这样做,没有明显的原因),那么您将插入包含他们的姓名和电子邮件的一行,然后是三个仅包含其年龄的行。)

另外,神圣的 SQL 注入,蝙蝠侠。见http://bobby-tables.com/

我假设您仍在学习,但要学会在担心其他任何事情之前不要先编写不安全的代码。

于 2012-09-10T16:07:06.900 回答
0

您正在执行三个 INSERT。INSERT 查询在数据库中创建一条新记录。

如果要将信息存储在同一行中,则应该有一个包含 age 和 trip2date 值的 INSERT 查询。

或者,如果你想保持结构有一个 INSERT 和两个 UPDATE 查询,它们通过你拥有的任何主键来更新记录。

于 2012-09-10T16:10:31.363 回答
0

哇,好吧,我同意 ManseUK

1) 您的查询极易受到 SQL 注入的攻击。请参阅 - "Bobby Tables" XKCD 漫画中的 SQL 注入如何工作?

2) mysqllibrary 已被弃用,该库不再被开发。您应该使用 MySQLi 或 PDO - 请参阅http://www.php.net/manual/en/mysqlinfo.api.choosing.php

3)您的数据库未标准化。也就是说,您有多个值进入一行的一个字段(所有旅行日期。请参阅http://en.wikipedia.org/wiki/Database_normalization

4) 您正在运行 3 个插入查询。您应该通过首先准备数据在一个查询中完成此操作。


更新

好的,这是我的解决方案。它带来了更多的建议。不要攻击或侮辱帮助你的人。我们不知道这段代码最终会在哪里结束,并且设计不安全的软件是一个坏习惯。糟糕的代码会产生更多的糟糕代码,最终导致 IT 行业看起来像白痴。LinkedIn 的违规行为很可能是 SQL 注入。这个网站上的一些人会以艰难的方式学习。

其次,该网站的目的是教育人们并解决问题。所以是数据库的入门。

当您运行 INSERT 查询时,它会在数据库的表中创建一个或多个行。您指定的字段用您提供的数据填充,其余的用空白填充。3 INSERT 查询?3 行。

这里有几个版本来改进它

1.0 版: “mysql_”单行(已修复 SQL 注入):

<?php
//Database Connection as Before ...
$first_name = mysql_real_escape($_POST['First_Name']); 
$last_name = mysql_real_escape($_POST['Last_Name']);
$email = mysql_real_escape($_POST['email'];
foreach($age as $range) {
   $my_range = $my_range . mysql_real_escape($range) . ", ";
}
foreach($trip2date as $triprange) {
   $my_triprange = $my_triprange . mysql_real_escape($triprange) . ", ";
}
mysql_query("INSERT INTO `pax` (`First_Name`, `Last_Name`, `email`, `age`,`trip2date`)   
     VALUES('$first_name','$last_name','$email', '$my_range','$my_triprange')") 
     or die(mysql_error()); 
mysql_close($dbc);
?>

2.0 版: “mysql_”单行(已修复 SQL 注入):

<?php

$dbc = @new mysqli($host, $username, $password, $dbname);
if ($dbc->connect_error) {
  die('Error connecting to MySQL server' . $mysqli->connect_error);
}
$first_name = $dbc->real_escape($_POST['First_Name']); 
$last_name = $dbc->real_escape($_POST['Last_Name']);
$email = $dbc->real_escape($_POST['email'];
foreach($_POST['age'] as $range) {
   $my_range = $my_range . $dbc->real_escape($range) . ", ";
}
foreach($trip2date as $triprange) {
   $my_triprange = $my_triprange . $dbc->real_escape($triprange) . ", ";
}
$dbc->query("INSERT INTO `pax` (`First_Name`, `Last_Name`, `email`, `age`,`trip2date`)   
     VALUES('$first_name','$last_name','$email', '$my_range','$my_triprange')") 
     or die($dbc->error()); 
$dbc->close();
?>

关于数据库,多表将是存储范围的理想方式。但是,鉴于这是一个小项目,仅将列表用作非规范化字段可能就足够了。即使在大型项目中(在默认数据库类型(MyISAM)中不起作用),我通常也不会为 FOREIGN KEYS 烦恼,而只是在应用程序端强制执行它。这里的数据库开发人员会有所不同。


示例数据库结构和内容

pax  //Sample data, only a few fields for example
-----------
id , firstname , lastname
1 , 'John' , 'Doe',
2,  'Joe', 'Bloggs',
3, 'Anne', 'Smith',

pax_ages
--------
pax_id, ageGroup
1, 20-55
1, 55+
2, 20-55
3, 20-55

查询和一些要插入的伪代码

//Do insert similar to V2.0 (removing age) and then
$id = $mysqli->insert_id;  //mysql version $id = mysql_insert_id();
foreach($_POST['age'] as $range) {
   $iQ = "INSERT INTO `pax_ages` VALUES('$id', '$mysqli->real_escape($range)')";
}
while($row = $result->fetch_assoc) {   // mysql version: $row = mysql_fetch_assoc($result)
   $query2 = "SELECT * FROM `pax_ages` WHERE `pax_id` = $row['id']";
   while($age_row = $result2->fetch_assoc) {
       $ageRanges .=  $age_row['ageGroup'];
   }
}

查询和一些要检索的伪代码

"SELECT * FROM `pax`";
while($row = $result->fetch_assoc) {   // mysql version: $row = mysql_fetch_assoc($result)
   $query2 = "SELECT * FROM `pax_ages` WHERE `pax_id` = '$row['id']'";
   while($age_row = $result2->fetch_assoc) {
       $ageRanges .=  $age_row['ageGroup'];
   }
}
于 2012-09-10T16:12:07.197 回答