オーケー、助けが必要だ。ユーザーが質問をして最大 4 枚の写真をアップロードできるページをデザインしようとしています。2 つのデータベース テーブル、質問と image_table があります。すべてが正しくアップロードされているので、それは私の問題ではありません。私が問題を抱えているのは、その質問にのみ対応する image_table データベースから画像を選択することです。これを行う方法がわかりません。どんな助けでも大歓迎です。
2 に答える
画像が属する質問の ID を含むquestion_id
列が必要です。image_table
別のテーブルを参照する列を持つテーブルの概念は、外部キーと呼ばれます。
image_table
次の SQL コマンドを使用して、既存の外部キーを追加できます。
ALTER TABLE image_table
ADD question_id integer DEFAULT NULL;
外部キー制約の追加:
ALTER TABLE image_table
ADD CONSTRAINT image_question_fk
FOREIGN KEY (question_id)
REFERENCES questions(question_id);
次に、(MySQL を使用していると仮定して、phpMyAdmin のようなツールを使用して) すべてのquestion_id
フィールドをimage_table
適切に入力します。
次に、質問によって画像をクエリできます。質問 5 の画像を取得したいとしましょう。次に、クエリは次のようになります。
SELECT image_table.*
FROM image_table, questions
WHERE image_table.question_id = question.question_id
AND questions.question_id = 5;
テーブルの画像に FOREIGN KEY があり、これはテーブルの質問の PRIMARY KEY を参照しています。その関係と呼ばれる...
削除時カスケードを追加でき、質問が削除されるたびに、対応する画像が削除されるのは本当に良いことです。
外部キーの例
CREATE TABLE questions (
questionid INT AUTO_INCREMENT,
question TEXT,
PRIMARY(questionid)
)
CREATE TABLE images (
imagesid INT AUTO_INCREMENT,
questionid INT NOT NULL,
path VARCHAR(255),
PRIMARY KEY (imageid),
FOREIGN KEY (questionid) REFERENCES questions(questionid)
)
GROUP_CONCAT を使用して、すべての画像パスを結果セットの配列に入れることができます。したがって、クエリの結果は 1 行のみになります。
SELECT *, GROUP_CONAT(i.path) AS images
FROM questions q
INNER JOIN images i ON i.questionid = q.questionid
WHERE q.questionid = $xy
GROUP BY q.questionid
- - - 編集 - -
あなたが説明したプロセスは、私には次のように見えます:
- ユーザーがアップロード フォームを送信する
- phpでフォームデータをキャッチします
- 画像などをアップロードします
- 質問と画像をデータベースに挿入します <-- $xy = mysql_insert_id() to var
- 上記のクエリで画像を選択します
- 結果をエコーする
- 編集 -
画像のアップロード フォームは質問とは別のものです。SQL選択は必要ありません...アップロードするパスと、アップロードする画像の名前を知っています
//uploading the image
if(!isset($_SESSION['questionImages'])) {
$_SESSION['questionImages'] = array();
}
$_SESSION['questionImages'][] = $dir.'/'.$_FILE['name'];
後で画像をエコーしたい場合は、 $_SESSION['questionImages'] 配列を使用するだけです
ユーザーが質問を送信した場合、セッション変数 questionImages をリセットする必要があります