1

現在のコードに問題があります。実際、どちらの方法でも正しい方向に進んでいるかどうかはわかりません。

私の現在のスクリプト(合計)は写真をアップロードし、MySQLデータベースからIDを返します。写真を選択すると、タグも付けられます。これらのタグを関​​連付けるために、後でクエリを実行するためにtag_idとphoto_idを単純に組み合わせるテーブル'tagrefs'を選択しました。テーブル'tags'は、tag_idとtag_nameで構成されます。テーブル'photos'にはたくさんのフィールドがあり、関連するのはphoto_idだけです。

現在、POSTを介してタグを渡します。

      $tags = trim($_POST['tags']);
  $tags = preg_replace('/\s+/', '', $tags);
  $tags = htmlspecialchars($tags);
  $tags = mysql_real_escape_string($tags);
  $tags = strip_tags($tags);
  $tags = explode(",", $tags);

$insert = $dbh->prepare('INSERT INTO tags (tag_name) VALUES (:tag)');
$insert->bindParam(':tag', $tag, PDO::PARAM_STR);
foreach ($tags as $tag) $insert->execute();


$select = $dbh->prepare('SELECT tag_id FROM tags WHERE tag_name = (:tag)');
$select->execute();
$result = $select->fetch(PDO::FETCH_ASSOC);
print_r($result);
print("\n");

$ selectまでは、完全に機能します。タグが挿入され、写真がアップロードされます。ピーチー。次に、追加したtag_nameのtag_idを取得するものを作成する必要があります。次に、それをphoto_idと組み合わせて、「tagrefs」に挿入する必要があります。一番下の$selectは、ユーザーがPOSTした文字列と比較して、作成したばかりのtag_idを取得しようとして失敗したものです。私が考えていた方法は、それらを取得してから、photo_idとtag_idを使用して新しい配列を作成し、値を「tagrefs」に挿入することです。

それはすべて非常に複雑に聞こえ、おそらくそれを行うためのはるかに優れた/より安全な方法がありますが、1時間のグーグルは役に立ちませんでした。

4

1 に答える 1

1
foreach ($tags as $tag) $insert->execute();

間違っている。はない{}ので、foreachが実行しているのは、1回の呼び出しを何度も実行することだけです。その後の残りのコードは、foreachの一部として実行されません。そのため、すべてのタグを挿入し、ループが完了すると、挿入した最後のタグのIDを取得しようとします。このtag_idがauto_increment主キーフィールドであると仮定すると、次のようなものを使用する必要があります。

foreach($tags as $tag) {
    $insert->execute();
    $tag_id = $insert->lastInsertId();
    ....
}

とにかく専用の選択をしていません。

于 2013-01-18T21:44:54.270 に答える