0

わかりましたので、基本的に私がやろうとしているのは、私のウェブサイトに Q&A コンポーネントを追加することです (最初のウェブサイトなので、現在の PHP の知識は最小限です)。ユーザーの入力が記録され、データベースに追加される html ページがありますが、その特定の情報をデータベースから引き出すのに問題があります。

私の現在のphpページは、データベース内のthe questiondetail= the question detail( detail='$detail') の情報を取得していますが、2人のユーザーが質問の詳細として同じ情報を入力すると、問題が発生する可能性があります(可能性は低いですが、特に同じ人が誤って質問を2回送信した場合は可能です) )。私がやりたいことは、データベースの question_id (主キー) に従ってページをロードすることです。これは、常に一意になる唯一のものです。

HTML コード:

<form id="question_outline" action="process.php" method="get">
<p><textarea name="title" id="title_layout" type="text"  placeholder="Question Title" ></textarea> </p>
<textarea name="detail"  id= "detail_layout" type="text" placeholder="Question Details"  ></textarea>
<div id="break"> </div>
<input id="submit_form" name="submit_question" value="Submit Question" type="submit" /> 
</form>

PROCESS.PHP コード:

$name2 = $_GET['name2'];
$title = $_GET['title'];
$detail = $_GET['detail'];

$query= "INSERT INTO questions (title, detail) VALUES ('$title', '$detail')";

$result = mysql_query("SELECT * FROM questions where detail='$detail' ") 
or die(mysql_error());  

情報はデータベースに正しく保存されており、detail=$detail の場合は正常に取り出されていますが、私が探しているのは、常に一意になる唯一の値であるため、question_id に従って情報を引き出すことです。 . どんな反応でも大歓迎です!

更新版

QUESTION_EXAMPLE.PHP コード

<?php
$server_name = "my_servername";
$db_user_name ="my_username";
$db_password = "my_password";
$database = "my_database";
$submit = $_GET['submit'];
$title = $_GET['title'];
$detail = $_GET['detail'];
$conn = mysql_connect($server_name, $db_user_name, $db_password);

mysql_select_db($database) or die( "Unable to select database");

$result = mysql_query("SELECT title, detail FROM questions WHERE id =" .
mysql_real_escape_string($_GET["id"]), $conn);

$row = mysql_fetch_assoc($result);

mysql_close($conn);

?>

<h1><?php echo htmlspecialchars($row["title"]);?></h1>
<p><?php echo htmlspecialchars($row["detail"]);?></p>
4

3 に答える 3

2

まず、それが本番環境で使用されるコードである場合は、ステートメントにプラグインする前に、SQL パラメーターをエスケープしていることを確認してください。SQL インジェクション攻撃を楽しんでいる人はいません。代わりに PDO を使用することをお勧めします。これは、準備されたステートメントと、はるかに安全なパラメーター バインディングをサポートするためです。

PHPでSQLインジェクションを防ぐにはどうすればよいですか?

だからあなたはフォームを持っています...

[title]

[details]

[submit]

そして、それがデータベースに挿入されます...

INSERT INTO questions (title, details) VALUES (?, ?)

http://php.net/manual/en/function.mysql-insert-id.phpmysql_insert_idを使用して、最後の挿入 ID を取得できます。

$id = mysql_insert_id();

その後、レコードを取得できます...

SELECT title, details FROM questions WHERE id = ?

そしてプレビューページに出力します。

基本的な mysql 関数の代わりに PDO を使用する例を書きました。

form.php:

<form action="process.php" method="post">
    <label for="question_title">Title</label>
    <input id="question_title" name="title"/>
    <label for="question_detail">Detail</label>
    <input id="question_detail" name="detail"/>
    <button type="submit">Submit</button>
</form>

process.php:

<?php

// Create a database connection
$pdo = new PDO("mysql:dbname=test");
// Prepare the insert statement and bind parameters
$stmt = $pdo->prepare("INSERT INTO questions (title, detail) VALUES (?, ?)");
$stmt->bindValue(1, $_POST["title"], PDO::PARAM_STR);
$stmt->bindValue(2, $_POST["detail"], PDO::PARAM_STR);
// Execute the insert statement
$stmt->execute();
// Retrieve the id
$id = $stmt->lastInsertId();

// Prepare a select statement and bind the id parameter
$stmt = $pdo->prepare("SELECT title, detail FROM questions WHERE id = ?");
$stmt->bindValue(1, $id, PDO::PARAM_INT);
// Execute the select statement
$stmt->execute();
// Retrieve the record as an associative array
$row = $stmt->fetch(PDO::FETCH_ASSOC);

?>

<h1><?php echo htmlspecialchars($row["title"]);?></h1>
<p><?php echo htmlspecialchars($row["detail"]);?></p>

PDOなし...

form.php:

<form action="process.php" method="post">
    <label for="question_title">Title</label>
    <input id="question_title" name="title"/>
    <label for="question_detail">Detail</label>
    <input id="question_detail" name="detail"/>
    <button type="submit">Submit</button>
</form>

process.php:

<?php

// Create a database connection
$conn = mysql_connect();
// Execute the insert statement safely
mysql_query("INSERT INTO questions (title, detail) VALUES ('" . 
    mysql_real_escape_string($_POST["title"]) . "','" .
    mysql_real_escape_string($_POST["detail"]) . "')", $conn);
// Retrieve the id
$id = mysql_insert_id($conn);
// Close the connection
mysql_close($conn);

header("Location: question_preview.php?id=$id");

question_preview.php:

<?php

// Create a database connection
$conn = mysql_connect();
// Execute a select statement safely
$result = mysql_query("SELECT title, detail FROM questions WHERE id = " .
    mysql_real_escape_string($_GET["id"]), $conn);
// Retrieve the record as an associative array
$row = mysql_fetch_assoc($result);
// Close the connection
mysql_close($conn);

?>

<h1><?php echo htmlspecialchars($row["title"]);?></h1>
<p><?php echo htmlspecialchars($row["detail"]);?></p>
于 2012-09-23T00:24:53.017 に答える
0

question_idに従って質問を並べ替えたいと思います。ORDERBYコマンドを使用してみてください

例 -

$result = mysql_query("SELECT * FROM questions where detail='$detail' ORDER BY question_id")
于 2012-09-23T00:09:54.003 に答える
0

これらのタイプの例では、以下のデータベース内でトランザクションを実行する必要があります

http://dev.mysql.com/doc/refman/5.0/en/commit.html

またはそうでなければ

セッションに格納された確率変数を作成し、データベースにも挿入すると、データベースから呼び出して簡単にプレビューできます。

id | question_code | q_title

question_codeデータベースに挿入する前に生成されたランダム値です。

をセッションに保存し、question_codeプレビューのために再度呼び出します。

于 2012-09-23T00:21:30.393 に答える