私はPHPの初心者です。twitter-bootstrapを使用してWebサイトを作成しています。Webサイトのドロップダウンメニューから送信されたデータをdatawebcollectiondbという名前のMySQLデータベースに保存したいと思います。ユーザーが開いているテキストフィールドから入力を送信したときに情報をデータベースに保存できますが、ドロップダウンメニューからは保存できません。ドロップダウンメニューが送信されると、データベースはすべてのフィールドに0を入力します。
まず、機能したオープンテキストフィールド:
HTMLファイル:
<html>
<body>
<form action="insert.php" method="post">
Number Please: <input type="text" name="directionp">
Another Number: <input type="text" name="timep">
Third Number: <input type="text" name="locationp">
Fourth Number: <input type="text" name="searchtimep">
<input type="submit">
</form>
</body>
</html>
動作したPHPファイル:
<?php
$con = mysql_connect("host", "username", "password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("timeforparkingdb", $con);
$sql="INSERT INTO datawebcollection (directionp, timeofdayp, locationp, searchtimep)
VALUES
('$_POST[directionp]','$_POST[timep]','$_POST[locationp]','$_POST[searchtimep]')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 more record added =) ";
mysql_close($con);
?>
dbに0を入力する以外に、上記のphpファイルと連携して機能しなかったHTMLファイル:
<html>
<form action="insert.php" method="post">
<b>DIRECTION:</b>
<select name="directionp">
<option value="1">Coming</option>
<option value="2">Going</option>
</select>
<b>TIME:</b>
<select name="timep">
<option value="0">12:00am - 1:00am</option>
<option value="1">1:00am - 2:00am</option>
<option value="2">2:00am - 3:00am</option>
<option value="3">3:00am - 4:00am</option>
<option value="4">4:00am - 5:00am</option>
<option value="5">5:00am - 6:00am</option>
<option value="6">6:00am - 7:00am</option>
<option value="7">7:00am - 8:00am</option>
<option value="8">8:00am - 9:00am</option>
<option value="9">9:00am - 10:00am</option>
<option value="10">10:00am - 11:00am</option>
<option value="11">11:00am - 12:00pm</option>
<option value="12">12:00pm - 1:00pm</option>
</select>
<b>LOCATION:</b>
<select name="locationp">
<option value="1">Zone One</option>
<option value="2">Zone Two</option>
<option value="3">Zone Three</option>
<option value="4">Zone Four</option>
<option value="5">Zone Five</option>
<option value="6">Zone Six</option>
<option value="7">Zone Seven</option>
<option value="8">Zone Eight</option>
<option value="9">Zone Nine</option>
<option value="10">Zone Ten</option>
<option value="11">Zone Eleven</option>
<option value="12">Zone Twelve</option>
<option value="13">Zone Thirteen</option>
</select>
<b>SEARCH TIME HERE:</b>
<select name="searchtimep">
<option value="0">Under 1 Minute</option>
<option value="1">1 Minute - 3 Minutes</option>
<option value="5">3 Minutes - 5 Minutes</option>
<option value="10">5 Minutes - 10 Minutes</option>
<option value="15">10 Minutes -15 Minutes</option>
<option value="20">15 Minutes - 20 Minutes</option>
<option value="25">20 Minutes - 25 Minutes</option>
<option value="30">25 Minutes - 30 Minutes</option>
<option value="35">30 Minutes - 35 Minutes</option>
<option value="40">35 Minutes - 40 Minutes</option>
<option value="45">40 Minutes - 45 Minutes</option>
<option value="50">45 Minutes - 50 Minutes</option>
<option value="55">50 Minutes - 55 Minutes</option>
<option value="60">55 Minutes - 1 HOUR</option>
<option value="0">Over 1 HOUR</option>
</select>
<button type="submit" class="btn btn-large btn-primary">Submit</button>
</form>
</html>
元のMySQLデータベース構造:
Field Type Collation Attributes Null Default Extra Action
unique_entry_id int(11) No
dayp int(2) No
monthp int(2) No
yearp int(4) No
directionp int(1) No
timeofdayp int(2) No
locationp int(2) No
searchtimep int(2) No
これまでのところ、データベース内に表示されているもの:
unique_entry_id dayp monthp yearp directionp timeofdayp locationp searchtimep
0 6 6 6 0 0 0 0
0 7 7 7 0 0 0 0
0 8 24 2345 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
値が0以外の行は、元のコードを実行したときのものであり、0のみの行は、ドロップダウンフォームからのものです。正しい相関オプション値をデータベースに保存されている値にするにはどうすればよいですか?<option value="1">Zone One</option> <option value="2">Zone Two</option>
オプションに割り当てられた値、つまり、データベースに送信された値であると思いました。
Chromeデベロッパーコンソールで見たものform data
:
direction=2&time=5&location=5&searchtime=25
それでもデータベースはすべて0を記録しました。
修正されたMySQLデータベース構造:現在修正されたデータベース構造:
Field Type Collation Attributes Null Default Extra
unique_entry_id int(11) No
city_id varchar(50) utf8_general_ci No
datep date No
directionp int(1) No
timeofdayp time No
locationp int(2) No
searchtimep int(2) No
テキストではなく整数をPHPコードからmySQLデータベースに渡すために、一重引用符を削除しました。
<?php
$con = mysql_connect("", "", "");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("timeforparkingdb", $con);
$sql="INSERT INTO datawebcollection (directionp, timeofdayp, locationp, searchtimep)
VALUES
($_POST[directionp],$_POST[timep],$_POST[locationp],$_POST[searchtimep])";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "Thank you for your submission! 1 more record added =) ";
mysql_close($con);
?>
SQLインジェクションを回避するための最初のステップでは、HTMLを次のように変更しました。
<form action="insert.php" id="timeforparking" method="post">
<input type="submit">
</form>
と:
DIRECTION:
<select form = "timeforparking" id="directionp">
<option value="1">Parking In Manhattan</option>
<option value="2">Leaving Manhattan</option>
</select>
TIME:
<select form = "timeforparking" id="timep">
<option value="0">12:00am - 1:00am</option>
<option value="1">1:00am - 2:00am</option>
<option value="2">2:00am - 3:00am</option>
<option value="3">3:00am - 4:00am</option>
<option value="4">4:00am - 5:00am</option>
<option value="5">5:00am - 6:00am</option>
<option value="6">6:00am - 7:00am</option>
<option value="7">7:00am - 8:00am</option>
<option value="8">8:00am - 9:00am</option>
<option value="9">9:00am - 10:00am</option>
<option value="10">10:00am - 11:00am</option>
<option value="11">11:00am - 12:00pm</option>
<option value="12">12:00pm - 1:00pm</option>
<option value="13">1:00pm - 2:00pm</option>
<option value="14">2:00pm - 3:00pm</option>
<option value="15">3:00pm - 4:00pm</option>
<option value="16">4:00pm - 5:00pm</option>
<option value="17">5:00pm - 6:00pm</option>
<option value="18">6:00pm - 7:00pm</option>
<option value="19">7:00pm - 8:00pm</option>
<option value="20">8:00pm - 9:00pm</option>
<option value="21">9:00pm - 10:00pm</option>
<option value="22">10:00pm - 11:00am</option>
<option value="23">11:00am - 12:00pm</option>
</select>
LOCATION:
<select form = "timeforparking" id="locationp">
<option value="1">Zone One</option>
<option value="2">Zone Two</option>
<option value="3">Zone Three</option>
<option value="4">Zone Four</option>
<option value="5">Zone Five</option>
<option value="6">Zone Six</option>
<option value="7">Zone Seven</option>
<option value="8">Zone Eight</option>
<option value="9">Zone Nine</option>
<option value="10">Zone Ten</option>
<option value="11">Zone Eleven</option>
<option value="12">Zone Twelve</option>
<option value="13">Zone Thirteen</option>
</select>
REPORT YOUR APPROXIMATE SEARCH TIME HERE:
<select form = "timeforparking" id="searchtimep">
<option value="0">Under 1 Minute</option>
<option value="1">1 Minute - 3 Minutes</option>
<option value="5">3 Minutes - 5 Minutes</option>
<option value="10">5 Minutes - 10 Minutes</option>
<option value="15">10 Minutes -15 Minutes</option>
<option value="20">15 Minutes - 20 Minutes</option>
<option value="25">20 Minutes - 25 Minutes</option>
<option value="30">25 Minutes - 30 Minutes</option>
<option value="35">30 Minutes - 35 Minutes</option>
<option value="40">35 Minutes - 40 Minutes</option>
<option value="45">40 Minutes - 45 Minutes</option>
<option value="50">45 Minutes - 50 Minutes</option>
<option value="55">50 Minutes - 55 Minutes</option>
<option value="60">55 Minutes - 1 HOUR</option>
<option value="0">Over 1 HOUR</option>
</select>
そして、私は注入を避けるためにphpに何かをしなければならないでしょう、そして私はこれのために私が何をする必要があるかをまだ理解していません、そして私は現在これをhttp://php.net/manual/en/pdo.preparedで研究しています-statements.php、そして私の場合に以下を適用しようとしています:
This example performs an INSERT query by substituting a name and a value for the named placeholders.
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
私の値のいくつかが空である可能性があります。次に、POSTパラメータを確認し、[投稿値の印刷]を使用してphpコードで出力します。具体的には次のとおりです。
<?php
// loop through every form field
while( list( $field, $value ) = each( $_POST )) {
// display values
if( is_array( $value )) {
// if checkbox (or other multiple value fields)
while( list( $arrayField, $arrayValue ) = each( $value )) {
echo "<p>" . $arrayValue . "</p>\n";
}
} else {
echo "<p>" . $value . "</p>\n";
}
}
?>
送信後の出力:
blank white screen
これは、空の値をデータベースに渡そうとしていることを意味しますか?また、SQLエラーがあることがわかっているため、データベースですべての0を受信しなくなりました(または、空白の値を渡しているため、つまり$_POST[locationp]と$_POST[searchtimep]が空ですか?それは正しい結論ですか?もしそうなら、なぜそれがそれをしているのですか?)一重引用符なしで更新されたPHPで; 最新のPHP[上記のように一重引用符なしで送信されないため、テキストとして送信されません]と、フォームにIDタグを使用する上記のHTMLを使用すると、次のようになります。
"Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,)' at line 3"
ウェブページから送信する場合。その結果、Chromeはフォーム値に関して何も表示せず、「リクエストヘッダー」と「レスポンスヘッダー」のみが表示されます。
私の元の質問/投稿はまだです:ドロップダウンメニューからMySQLデータベースに値を保存しますか?
解決策を収集できなかった関連する質問:ドロップダウンからPHPを使用してデータベースにデータを挿入する