0

私は最初のデータベースの1つを作成しており、1つのテーブルを使用してphp/mysql調査のすべての応答を含めています。ただし、応答は1つのテーブルに投稿されていますが、3つの異なる行に投稿されています。これは、3つのセクションの応答に対して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 歳の両方になるにはどうすればよいでしょうか。おそらくラジオグループが必要なので、彼らは1つのオプションしか選択できません. (ここでも、複数の行を挿入する可能性があります。ユーザーが 3 つの年齢層すべてにチェックマークを付ける場合 (明確な理由なしに許可します)、名前と電子メールを含む 1 つの行を挿入し、次に 3 つの年齢層を挿入します。年齢のみを含む行)。

また、神聖な SQL インジェクション、バットマン。http://bobby-tables.com/を参照

あなたはまだ学んでいると思いますが、他のことを心配する前に、まず安全でないコードを書かないことを学んでください。

于 2012-09-10T16:07:06.900 に答える
0

3 つの INSERT を実行しています。INSERT クエリは、データベースに新しいレコードを作成します。

情報を同じ行に格納する場合は、age と trip2date の値を含む 1 つの INSERT クエリが必要です。

または、構造を維持したい場合は、1 つの INSERT クエリと 2 つの UPDATE クエリを使用して、所有する主キーによってレコードを更新します。

于 2012-09-10T16:10:31.363 に答える
0

うわー大丈夫、私はManseUKに同意します

1) クエリは SQL インジェクションに対して非常に脆弱です。参照 - 「Bobby Tables」XKCD コミックからの SQL インジェクションはどのように機能しますか?

2)mysqlライブラリは非推奨であり、ライブラリは開発されていません。MySQLi または PDO を使用する必要があります。http: //www.php.net/manual/en/mysqlinfo.api.choosing.php を参照してください。

3) データベースが正規化されていません。つまり、行の 1 つのフィールド (すべての旅行日) に複数の値が入っています。http://en.wikipedia.org/wiki/Database_normalizationを参照してください。

4) 3 つの挿入クエリを実行しています。最初にデータを準備して、1 つのクエリで実行する必要があります。


アップデート

さて、これが私の解決策です。さらにいくつかのアドバイスが付属しています。あなたを助けてくれる人々を攻撃したり侮辱したりしないでください。このコードがどこに行き着くかはわかりません。安全でないソフトウェアを設計するのは悪い習慣です。悪質なコードが世に出回ると、さらに悪質なコードが生成され、最終的に IT 業界をバカに見せる原因となります。LinkedIn の違反は、おそらく SQL インジェクションでした。このサイトの一部は難しい方法を学びます。

第二に、このサイトの目的は人々を教育し、問題を解決することです。データベースの入門書です。

INSERT クエリを実行すると、データベース内のテーブルに 1 つ以上の行が作成されます。指定したフィールドには指定したデータが入力され、残りは空白で埋められます。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();
?>

データベースに関しては、マルチテーブルが範囲を格納する理想的な方法です。ただし、これは小さなプロジェクトであるため、リストを正規化されていないフィールドとして使用するだけでおそらく十分です。私は通常、大規模なプロジェクト(デフォルトのDBタイプ(MyISAM)では機能しない)でもFOREIGN KEYSを気にせず、アプリケーション側で強制します。ここのデータベース開発者は異なります。


サンプル DB の構造と内容

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 に答える