0

これはインターネットに投稿された最初の質問です。通常は何らかの解決策を見つけることができましたが、今は別のより基本的な方法でこれを行うか、スタックオーバーフローの誰かから助けを得ることを望んでいます. 私は別の方法でそれを行う方法を考えていますが、このように機能させることができれば本当に好きです.

私は、人々や組織が避難所のモバイルチームが拾うために寄付したい服について避難所に知らせることができるインターネットアプリケーションを構築しようとしています.

HTML フォーム、PHP スクリプト、JavaScript 関数、および HTML フォームからの情報を格納するテーブルを作成するために使用される mySQL の簡略化されたバージョンを配置しています。

HTML フォーム:

<form action="apply.php" method="post">
<p>Please enter your personal info so we can make contact with you:<br />
Name: <input type="text" name="name" /><br />
Address: <input type="text" name="addr" /><br />
Phone: <input type="text" name="phon" /><br />
e-mail: <input type="text" name="emai" /><br /><br />
<!--previous part of the form needs to be entered only once in a table named
"application" in real form there are more fields-->     
<div id="dod">
<p><b>I wish to donate:</b> (in case you wish to donate more stuff click on
"Add more"):</p>
<p> <select name="kind">
<option value="Jacket">Jacket</option>
<option value="Shirt">Shirt</option>
<option value="Pants">Pants</option>
</select></p>
<!--there are more options in the actual form-->
<p>How many items of this type would you like to donate?
<input type="text" name="piec"></p>      
<p>Size of the items: <select name="size">
<option value="S">S</option>
<option value="M">M</option>
<option value="L">L</option>
<option value="Other">Other</option>
<option value="Various">Various</option>
</select></p><br />
<!--This part should be entered several times depending on how many types of clothes
and in which sizes people wish to donate. There are more options in actual form-->
</div>
<center>
<a href="#" onclick="JavaScript:addClothes()" style="font-family: 'verdana'">Add more
</a><br /><br />
<input type="submit" value="Submit"></input>
</center>
</form>

これは、フォーム フィールドを追加する JavaScript の簡易バージョンです。

function addClothes() {
document.getElementById('dod').innerHTML+="<p><select name='kind'><option\n\
value='Jacket'>Jacket</option>\n\
<option value='Shirt'>Shirt</option>\n\
<option value='Pants'>Pants</option>\n\
</select>\n\
</p><p>How many items of this type would you like to donate? <input type='text'\n\
name='piec'></p>
<p>Size: <select name='size'><option value='S'>S</option>\n\
<option value='M'>M</option>\n\
<option value='L'>L</option>\n\
<option value='Other'>Other</option>\n\
<option value='Various'>Various</option></select></p><br />";
}

これらは、shelter_db データベースでテーブルを作成するために使用される mySQL 式です。

CREATE TABLE shelter_db.application
(
Name varchar(80) NOT NULL,
Address varchar(80) NOT NULL,
Phone varchar(20) NOT NULL,
Email varchar(50) NOT NULL,
Stamp timestamp NOT NULL,
PRIMARY KEY (Stamp)
);

CREATE TABLE shelter_db.clothes
(
Kind varchar(40) NOT NULL,
Pieces integer(6) NOT NULL,
Size varchar(20),
Stamp timestamp,
FOREIGN KEY (Stamp)
REFERENCES application (Stamp)
);

私の考えは、これら 2 つのテーブルのデータを、レコードが作成されたときのタイムスタンプで関連付けることです。これは、異なる関係者による同時エントリがほとんど存在しないためです。寄付者に連絡する担当者は、その特定の当事者が寄付したいものを確認し、それに応じて車やピックアップ トラックを持った移動チームを送ることができます。

私が苦労しているのは、php/sql ページを作成する方法であり、何十もの Web ページを調べた後、自分のニーズに合った解決策を見つけることができませんでした。implode 関数を使用する必要があると想定していますが、さまざまな解決策を試した後、正しい解決策を見つけることができませんでした。コードは次のとおりです。

<?php
$con = mysql_connect('localhost','root','');
if (!$con) {die('Unable to connect: ' . mysql_error());}
mysql_select_db('shelter_db', $con);
//the following part needs only one entry into application table of the db
$sql="INSERT INTO application (Name, Address, Phone, Email, Stamp)
VALUES
('$_POST[name]','$_POST[addr]','$_POST[phone]','$_POST[emai]',time());
//the following part needs multiple entries depending on how many times the Add more 
//button in the HTML form has been clicked
INSERT INTO clothes (Kind, Pieces, Size, Stamp)
VALUES
('$_POST[kind]','$_POST[piec]','$_POST[size]',time())";
if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); }
else {
echo 'Database entry successful.';
}
mysql_close($con)
?>

私の例に合うコードを提供してくれる人に感謝します。長い投稿で申し訳ありませんが、彼らは徹底していると言いました. 前もって感謝します。

4

1 に答える 1

1

まず第一に、タイムスタンプによる相関は間違いなく良い考えではありません。まず第一に、2人があなたのウェブサイトをまったく同時に使用する可能性があり、彼らの提出は混乱するでしょう。次に、アプリケーションテーブルと洋服テーブルへの挿入の間に時間が変わる可能性があります(日時は2番目に正確であり、最初の挿入は時間T.999で、2番目はT+1.000であった可能性があります。この2番目の問題は次の方法で解決できます。スクリプトの先頭の時刻に変数を割り当て、それをすべての挿入で使用します。ただし、最初の問題があるため、これにはタイムスタンプを使用しないでください。

代わりに、アプリケーションに一意のIDを割り当てる必要があります。これは、オプション付きのID列を使用することにより、mysqlで簡単に実行auto-incrementできます。テーブルに行を追加するときは、この列を省略して(またはその値をNULLとして指定して)、サーバーは最後に割り当てられた値より1大きい値を自動的に割り当てます。この関数mysql_insert_id()は、最後に行った挿入で割り当てられた値を返します。application_id服のテーブルに、そのIDを含む列を追加します。これを使用して、2つのテーブルを相互に関連付けます。

次に対処する必要があるのは、フォーム内の複数の服の列を処理する方法です。追加した各行で、フォーム要素に前の行と同じ名前を付けました。PHPがフォームを処理しているとき、$_POST['kind']取得できるのはそのうちの1つだけです。[]これを処理する方法は、たとえば、で終わる名前を付けること<select name="kind[]">です。これは、これらの入力の配列を作成する必要があることをPHPに通知します。次に、最初の行の種類を、、$_GET['kind'][0]2番目の行は$_GET['kind'][1]、というように取得できます。したがって、データベースに書き込むときは、次のことができます。

foreach ($_GET['kind'] as $i => $kind) {
  $sql = "INSERT INTO clothes (Application_ID, Kind, Pieces, Size) VALUES ($id, ".$kind.", "$_GET['piec'][$i]", '"$_GET['size'][$i]"')";
  mysql_query($sql, $con) or die ('Error: ' . mysql_error());
}

$idから取得した値が含まれますmysql_insert_id()

mysql_XXX最後に、関数が非推奨であり、新しいコードで使用すべきではないことを指摘しなければ、SOアンサーとしての義務を果たすことはできませんでした。mysqli_XXXそれらはとPDOに取って代わられました。これらを使用すると、「プリペアド」ステートメントを作成できるため、上記のように変数を文字列に置き換える必要がありません。これにより、データをサニタイズすることに注意しない限り、SQLインジェクション攻撃が可能になる可能性があります(便宜上、上記では行いませんでした)。 )。

ところで、私はあなたのJavaScriptを見ていません。あまりないようです。他の誰かがそれに問題に気づいたら、パイプを張ってください。

于 2012-08-26T02:38:20.730 に答える