2017-03-31 10 views
0

私はデータベースにオンラインで接続し、アプリケーションからデータベースを編集できるようにしています。私はPHPとMySqlが初めてです。研究私は私がUPDATEステートメントを使用する必要があると思う、私はチュートリアルからサイト上の新しいユーザーを登録するためのコードを書いたが、INSERTステートメントをUPDATEステートメントに変更したいので、ユーザーは、私がPHPMYADMINで入力した既存のデータを更新します。誰かが私にこの方法を教えてくれますか?また、あなたがコメントの中にそれを言及するアプリケーションのコードを必要とし、私はそれを質問に追加するでしょう、私はあまりにも多くの不必要なコードを掲示したくありません。前もって感謝します。PHP/MySQLでInsertステートメントを更新ステートメントに変更する

<?php 
    require "conn.php"; 

    $patient_name = $_POST["patient_name"]; 
    $check_in_date = $_POST["check_in_date"]; 
    $room_number = $_POST["room_number"]; 
    $bed_number = $_POST["bed_number"]; 
    $notes = $_POST["notes"]; 

    $mysql_qry = "insert into patients(patient_name, check_in_date, room_number, bed_number, notes) values ('$patient_name', '$check_in_date', '$room_number', '$bed_number', '$notes')"; 

    if($conn->query($mysql_qry) === TRUE) { 
     echo "Insert successful"; 
    } 
    else{ 
     echo "Error: " . $mysql_qry . "<br>" . $conn->error; 
    } 
    $conn->close(); 
?> 

EDIT

固定コードは以下であり、それは今ではなく、新しいデータを追加するよりも、データベースに既に記録を更新します。

<?php 
    require "conn.php"; 

    $patient_name = $_POST["patient_name"]; 
    $check_in_date = $_POST["check_in_date"]; 
    $room_number = $_POST["room_number"]; 
    $bed_number = $_POST["bed_number"]; 
    $notes = $_POST["notes"]; 

    $mysql_qry = "UPDATE patients SET notes='$notes' WHERE patient_name='$patient_name'"; 

    if($conn->query($mysql_qry) === TRUE) { 
     echo "Insert successful"; 
    } 
    else{ 
     echo "Error: " . $mysql_qry . "<br>" . $conn->error; 
    } 
    $conn->close(); 
?> 
+0

あなたは、あなたが何を探している二つの異なる目的のためにアクセスすることができ、小さなAPIを構築を検討すべきです。 1つはput要求、もう1つはパッチ要求です。 – dsadnick

+0

[W3Schools](https://www.w3schools.com/sql/sql_update.asp) – FD3

+0

上記のコードは重大なセキュリティ上の欠陥を示しています。まず、 '$ _POST'値をデータベースに直接挿入します。これによりデータベースがSQLインジェクションに公開されます。 –

答えて

1

SQLインジェクションの脆弱性があり、このすべてのPHPコードの最初のあなたは、あなたのコードを更新する必要第二にmysqli prepared statementまたはPDO prepared statement

のいずれかを使用しないようにする必要があり、私はあなたがあなたの目標を達成知っている最も簡単な方法は、になるだろうユニークないくつかの列上の制約と、その後は、私が代わりにインサートの更新を決定するユニークなフィールドがあることを前提としていますこの例では、MySQLの機能ON DUPLICATE UPDATE

を使用patient_namecheck_in_dateroom_number、およびbed_number(場合にはジョン・スミスがseprateベッドでジョン・スミスと同じ部屋にいた)テーブルを更新するためのクエリは、SQLインジェクションビットおよびクエリ、I'LLに取り組むようになりましたので、この

ALTER TABLE `patients` ADD UNIQUE `unique_index`(`patient_name`, `check_in_date`, `room_number`, `bed_number`); 

ようになりますmysqli statementを使用する例を更新し、patient_namenotesは、文字列(varchar型/ NVARCHAR)していると仮定します、room_numberbed_numberは整数であり、check_in_date

編集私のオリジナルの答えは、クエリの構文エラーを持っていた日であります変数を以下の準備文に渡す更新答え

$mysqliConn = new mysqli("localhost", "my_user", "my_password", "mydatabase"); 

$stmt = $mysqliConn->prepare("insert into patients 
    (patient_name, check_in_date, room_number, bed_number, notes) 
    values (?, ?, ?, ?, ?) 
    ON DUPLICATE KEY UPDATE notes=values(notes)"); 

$patient_name = $_POST["patient_name"]; 
$check_in_date = $_POST["check_in_date"]; 
$room_number = $_POST["room_number"]; 
$bed_number = $_POST["bed_number"]; 
$notes = $_POST["notes"]; 

mysqli_stmt_bind_param($stmt, "sdiis", 
    $patient_name, $check_in_date, $room_number, $bed_number, $notes); 

希望は、これが一意のキーについて

編集 を助け、ユニークキーが一意のキーのすべてのフィールドが

上記の例のためにそう組み合わされたときに一意でなければならないことを意味しています

レコード1は patient_name、CHECK_IN_DATE、room_number、bed_numberは、 'ジョン・スミス'、 '2017年3月1日'、413、2、 '患者が病気である' 、レコード2がで指摘された場合'jane doe'、 '3/1/2017'、413,2、 'patient has wound'

これらの2つのレコードは上記の制約と重複していますが、制約を変更する必要がある場合は、あなたの制約何か他のTという名前の場合は、次の

DROP制約

ALTER TABLE `patients` DROP INDEX `unique_index`; 

はその後もこの

ALTER TABLE `patients` ADD UNIQUE `unique_index`(`patient_name`, `check_in_date`, `room_number`); 

のような制約を再作成しますハンunique_index

SHOW INDEX FROM `patients`; 

名を実行したキー名は、さらにあなたがあれば、これはあなたのPHPにあるように、クエリの最後の行を変更したい場合がありkey_name

になります見つけることができますあなたはまた、REPLACE INTOを使用することができ、ベッド数

ON DUPLICATE KEY UPDATE bed_number=values(bed_number), notes=values(notes) 
+0

答えの最初の部分を単に参照すると、データベースに「ID」という一意の識別子列がすでに自動増分されているので、登録された最初の人は1です、2番目は2などです。詳細な答えをありがとう! – MonBoy175

+0

ユニークな識別子またはプライマリキーは問題ありません。ユニークな制約が重複レコードを挿入してデータベースレベルで強制するのを防ぐため、異なるメモを持つ同じレコードを挿入するのではなく、患者のメモを更新しようとすると既存のノートを更新します。 – Jpsh

+0

よろしくお願いいたします。 $ MySQL_qry = "ALTER TABLE' patients'一意の 'unique_index'(' patient_name'、 'check_in_date'、' room_number'、 'bed_number');"を追加してください。 $ patient_name、$ check_in_date、$ room_number、$ bed_number、$ notesなどの値を入力すると、$ mysql_qry = "患者名(patient_name、check_in_date、room_number、bed_number、notes) ) "; ? – MonBoy175

0

を変更できるようにユニーク制約を変更し、SQL文を変更する必要はありません。 MySQLがあなたのために仕事をするようにしましょう。

https://dev.mysql.com/doc/refman/5.7/en/replace.html

<?php 
require "conn.php"; 

$patient_name = $_POST["patient_name"]; 
$check_in_date = $_POST["check_in_date"]; 
$room_number = $_POST["room_number"]; 
$bed_number = $_POST["bed_number"]; 
$notes = $_POST["notes"]; 

$mysql_qry = "REPLACE INTO patients(patient_name, check_in_date, room_number, bed_number, notes) VALUES ('$patient_name', '$check_in_date', '$room_number', '$bed_number', '$notes')"; 

if($conn->query($mysql_qry) === TRUE) { 
    echo "Insert successful"; 
} 
else{ 
    echo "Error: " . $mysql_qry . "<br>" . $conn->error; 
} 
$conn->close(); 

また、あなたは本当にプリペアドステートメントおよびパラメータとPDOを使用して見てみる必要があります。

https://secure.php.net/manual/en/pdo.prepare.php

関連する問題