3つのテーブルがあります。 B、参照あり;位置と参照の間の関係を行うCとC。各位置は複数の参照を持つことができますが、その反対は許されません。 私のルーチン: 位置と参照の間の関係を保存するページがフォームからsubmit buttomによって読み込まれたとき、私はこれを行います: 1.この位置が存在するかどうかを確認します はいの場合は2に行きます。 いいえの場合は、エラー。 2.この参照が存在するかどうかを確認します。 「はい」の場合は、この参照とこの位置の間の関係を追加します。 いいえの場合は、この参照を追加した後に、この参照とこの位置の間の関係を追加します。テーブルから最後に追加したエントリを別のテーブルに挿入します。
これは私の基本ルーチンです。私の問題?参照が存在しない場合、スクリプトは新しい参照を追加した後、新しい参照と位置の間の関係を追加します...しかし、うまくいきません。最初に、スクリプトは参照を追加するだけですが、関係を追加しないでください...私はページに戻って必要があり、再び作業に追加する必要があります。
マイコード:リロードページなしで、DBへと後に新しい参照を追加します。私は正常に動作すること、これを行うための別の方法を知らない
<?php
#verify if this position exists at db
if(!empty($_POST['position'])) {
$query_position = "SELECT `PositionsId`, `PositionsIdentifier` from `positions` WHERE `PositionsId` = '".$_POST['position']."'";
$select_position = mysqli_query($connect, $query_ref);
#if yes, proceed to insert the new reference into this position...
if (mysqli_num_rows($select_position)) {
#verify if the reference exists at DB
if(!empty($_POST['ref'])) {
$query_ref = "SELECT `ReferencesId`, `ReferencesIdentifier` from `references` WHERE `ReferencesIdentifier` = '".$_POST['ref']."'";
$select_ref = mysqli_query($connect, $query_ref);
if (mysqli_num_rows($select_ref)) {
$list_ref = mysqli_fetch_array($select_ref, MYSQLI_ASSOC);
#verify if this reference exists to this position
$query_reference = "SELECT `PositionRefId`, `PositionsRef_PosId`, `PositionRef_RefId` FROM `positions_refs` WHERE `PositionsRef_PosId` = '".$id."' AND `PositionsRef_RefId` = '".$list_ref['ReferencesId']."'";
$select_reference = mysqli_query($connect, $query_reference);
if (mysqli_num_rows($select_reference)) {
echo "This reference exists to this position...";
}
else {
#insert this reference to this position
$query_insert_reference = "INSERT INTO `positions_refs` (`PositionsRef_PosId`, `PositionRef_RefId`) VALUES ('".$id."','".$list_ref['ReferencesId']."')";
if (mysqli_query($connect, $query_insert_reference)) {
echo "OK.";
}
else {
echo "Error.";
echo "<br /><br />";
echo mysqli_error($connect);
}
}
}
else {
#if don't exists at db, insert the new reference
if(!empty($_POST['ref'])) {
$query_insert_ref = "INSERT INTO `references`(`ReferencesIdentifier`) VALUES ('".$_POST['ref']."')";
if (mysqli_query($connect, $query_insert_ref)) {
#select the new reference ID
$query_new_ref = "SELECT `ReferencesId`, `ReferencesIdentifier` from `references` WHERE `ReferencesIdentifier` = '".$_POST['ref']." LIMIT 1'";
$select_new_ref = mysqli_query($connect, $query_new_ref);
if (mysqli_num_rows($select_new_ref)) {
$list_new_ref = mysqli_fetch_assoc($select_new_ref, MYSQLI_ASSOC);
#insert the new reference to this position
$query_insert_reference = "INSERT INTO `positions_ref`(`PositionsRef_PosId`, `PositionRef_RefId`) VALUES ('".$id."','".$list_new_ref['ReferencesId']."')";
if (mysqli_query($connect, $query_insert_reference)) {
echo "OK.";
}
else {
echo "Error.";
}
}
else {
}
}
else {
echo "Error.";
}
}
else {
echo "Error";
}
}
}
else {
echo "Error";
}
}
}
else {
echo "Error.";
}
?>
... これを行うにはどのような方法を持っていますなど、この新しい参照を位置に追加しますか?
おかげで、
あなたのコードはに対して脆弱である[** SQLインジェクション**](HTTPSを://en.wikipedia.org/wiki/SQL_injection)攻撃。あなたは[** mysqli **](https://secure.php.net/manual/en/mysqli.prepare.php)または[** PDO **](https ://secure.php.net/manual/en/pdo.prepared-statements.php)ドライバ。 [**この記事**](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)には、いくつかの良い例があります。 –
私は正直に言えば、あなたの言及と位置の説明は私を混乱させる。しかし、あなたのコードを見て、私はあなたの2つの挿入ステートメントは、同じテーブルに挿入されていない気づいた...? INSERT INTO 'positions_refs' ....他のINSERT INTO' variantsref'は...それは普通ですか?最終的なコメント、あなたは取引を調べるべきです。 3つのクエリのうちの1つが失敗すると、参照整合性が損なわれる可能性があります(またはdbレベルで処理されます)。そして準備された声明! – Nic3500
こんにちは、 私はこれを修正しましたが、それは同じテーブルです。私はクエリを表示し、存在する場合はエラーを表示しますが、このスクリプトを実行すると、参照が存在しない場合は挿入されますが、この新しい参照を目的の位置に挿入しません。もう一度追加してみてください... この参照と位置の間の関係を追加するために最後の参照からIDを取得するのに問題があると思いますが、それが問題かどうかわかりません。 – Rafael