0

私は PHP/MYSql が初めてで、MYSql に送信するフォームを作成しようとしています。フォームコードは次のとおりです。

    <form action="insert.php" method="post">
    First Name: <input type="text" name="first"><br>
    Last Name: <input type="text" name="last"><br>
    Phone: <input type="text" name="phone"><br>

    <input type="Submit">
    </form>

ここにinsert.phpがあります:

<?php 
include "db-connect.php";

$first = $_POST['first'];
$last = $_POST['last'];
$phone = $_POST['phone'];

$query = "INSERT INTO users VALUES ('', '$first', '$last', '$phone')";
$result= mysql_query($query);

if($result) {
    echo "Data entered Successfully";
} else {
    echo "You suck at coding";
}

mysql_close();

?>

繰り返しますが、私は本当に新しいので、5歳のように説明していただければ幸いです.

編集: myphpadmin gui を使用してテーブルを作成しました。

フィールドは次のとおりです。

id: INT、プライマリ、自動インクリメント 最初: varchar (50) 最後: varchar (50) 電話: varchar (25)

EDIT2: Esailja のアドバイスに従って、mysql_error() 関数を追加しました。応答は次のとおりです。「不正な整数値: '' for column 'id' at row 1」

4

5 に答える 5

2

試す

$query = "INSERT INTO users (first, last, phone) VALUES ('$first', '$last', '$phone')";

...ここで、first、last、および phone は、テーブル内のフィールドの実際の名前です。

そして、echo "You suck atcoding" を echo mysql_error() に置き換えるための +1。:)

于 2012-11-09T00:59:25.177 に答える
0

次のことを行います。

1)関数を忘れてmysql_*、プロジェクトを最初から正しい方法でコーディングします。mysql_ブラウザの戻るボタンを押すことから始まるすべての関数を使用するPHP+MySQLの実行方法を教えようとするチュートリアルや、あなたが見ているものは何でも。新しいプロジェクトでは、PDOまたはmysqliのいずれかを使用する必要があります。PHPマニュアルからすぐに、これらの関数の使用を思いとどまらせる大きな赤い警告があります。これらは、PHPの将来のバージョンで、そして正当な理由で削除される予定です。代わりに、PDOまたはmysqliを使用してください。

2)ユーザーからの変数は、汚染されていると見なす必要があります。これには$_POST変数が含まれます。これに対処する最善の方法は、プリペアドステートメントです。これが主な目的です(複数のクエリに対しても高速です)。

// Connect to the DB substituting the values for your values:
$dbh = new PDO('mysql:host=localhost;dbname=your_database', $db_user, $db_password);

// Get PDO to display errors. You can comment this out for the live script
$dbh->setAttribute(PDO_ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION);

// Prepare the statement to be used during your query
$stmt = $dbh->prepare("INSERT INTO users (first, last, phone) VALUES ( :first , :last , :phone )");

// Bind the values to the prepared statement
$stmt->bindValue( ':first' , $first );
$stmt->bindValue( ':last' , $last );
$stmt->bindValue( ':phone' , $phone );

// Execute the query
$stmt->execute();

生成されたエラーを適切に処理したい場合は、ここにあるものをtry-catchブロックにラップすることもできます。

于 2012-11-09T01:19:51.247 に答える
0

フィールドを指定せずに行うINSERTと、MySQL は、宣言された順序ですべてのフィールドを挿入していると想定します。は数値であるためid、文字列には設定できません。フィールド名を指定することをお勧めします。たとえば、テーブルがより多くのフィールドを取得しても、既存のコードが壊れることはありません。

(私がこれを書き始めた時点で) まだ誰も言っていないことは、コードにひどい SQL インジェクション ホールがあるということです。PHPのレガシーインターフェースを使い続ける (またはmysqlにアップグレードしない) 場合、小さな Bobby テーブルを気にせずにそれを行う方法を次に示します。mysqliPDO

<?php 
include "db-connect.php";

$query = sprintf(
  "INSERT INTO users (first, last, phone) VALUES ('%s', '%s', '%s')",
  mysql_real_escape_string($_POST['first']),
  mysql_real_escape_string($_POST['last']),
  mysql_real_escape_string($_POST['phone'])
);
$result = mysql_query($query);

if ($result) {
    echo 'Data entered "Successfully".';
} else {
    echo 'You suck at coding because: ', mysql_error();
}

?>

PS register_shutdown_function「db-connect.php」内で使用してデータベース接続を閉じることも提案できますか? $cidから返される を追跡することもお勧めしmysql_connect(...)ます。

于 2012-11-09T01:07:43.333 に答える
0

mysql テーブル スキーマを提供していないため、よくわかりません。

$query = "INSERT INTO users (first, last, phone)
          VALUES ('" . $first . "', '" . $last . "', '" . $phone . "')

id列が ではなく INTEGER に設定されている場合はAUTO_INCREMENT、適切な整数をクエリに挿入してください。

$id = 72;
$query = "INSERT INTO users VALUES ('" . $id . "', '" . $first . "', '" . $last . "', '" . $phone . "')

しかし、それが の場合AUTO_INCREMENT、最初のコードは問題ないはずです。

于 2012-11-09T00:57:00.367 に答える
0

試す

$query = "INSERT INTO users (`id`, `first`, `last`, `phone`) VALUES (NULL, '$first', '$last', '$phone')";

これは、挿入する列の名前を含む、より完全なバージョンのクエリです。また、クエリに追加されるフィールド ($first、$last、$phone) に引用符が含まれていないことを確認してください。

于 2012-11-09T00:59:12.253 に答える