2017-11-27 21 views
0

私のプロジェクトは私の小学校の単純な出席記録です。私は、オンラインフォームを通じて入退室ログを提出し、次のクエリを使用してデータベースに書き込みます。PHP:INSERTとUPDATEを組み合わせる方法

$sql = "INSERT INTO table_one (first_name, last_name, location) 
VALUES ('$first_name', '$last_name', '$location')"; 

これまでのところうまくいきます。

同じように、この提出された情報の一部を同じデータベースの別のテーブルに書きたいと思います。このクエリは、単独で動作するときに単独で動作します。

$sql = "UPDATE another_table SET location='$location' WHERE first_name='$first_name'"; 

しかし、私の問題は、それらを両方とも順番に行う方法です。それらを連続して一覧表示するだけでは機能しません。

$sql = "INSERT INTO table_one (first_name, last_name, location) VALUES 
('$first_name', '$last_name', '$location')"; 

$sql = "UPDATE personnel_table SET location='$location' WHERE 
first_name='$first_name'"; 

両方のコマンドを組み合わせて実行する最も効果的(かつ安全)な方法は何ですか?

+0

他のテーブルを更新するanother_table SET location = '$ location' WHERE first_name = '$ first_name' ";"ここでは、その人のuserIDを識別子として使用してください。そうでなければテーブルに 'John'があり、 'ジョン 'これはすべてのジョンのレコードを更新します –

+0

*"それらを連続してリストするだけでは動作しません "* - なぜ動作しないのですか? – axiac

+0

ここでは$ sqlという文字列を書いています –

答えて

3

1つのクエリが失敗した場合、両方が失敗するようにトランザクションを使用する必要があります。両方のクエリの成功がデータベースを追加/更新する場合のみ。

$db= new PDO('mysql:host=localhost; dbname=test', $user, $pass); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try { 
    $db->beginTransaction(); 

    $sh = $db->prepare("INSERT INTO table_one (first_name, last_name, location) VALUES (?, ?, ?)"); 
    $sh->execute([$first_name, $last_name, $location]); 

    $sh = $db->prepare("UPDATE personnel_table SET location=? WHERE first_name=?"); 
    $sh->execute([$location, $first_name]); 

    $db->commit(); 
} catch (Exception $e) { 
    $db->rollBack(); 
} 
+0

これは非常に便利です、ありがとうございます。 – inthebluesky

1

この問題では、データベース(forEx mysql)でtriggerオプションを使用する必要があります。

トリガーはイベントのようなものです。テーブルに挿入すると、更新の第2テーブルが自動化されます。 forEx:

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); 
Query OK, 0 rows affected (0.03 sec) 

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account 
     FOR EACH ROW SET @sum = @sum + NEW.amount; 
Query OK, 0 rows affected (0.01 sec) 

このトリガーはアカウントテーブルのオブジェクトです。 @sum変数を更新して、更新第二の表の

1

を使用しますが、以下のようにトリガーを作成することができます。

delimiter # 
create trigger after_ins_trig after insert on first_table 
for each row begin 
UPDATE second_table 
SET new.location=old.location 
WHERE new.first_name=old.first_name end# 
delimiter ; 

あなたは、where句内のIDを確認することができます。

0

なぜ、この:

Table: teraz 
Create Table: CREATE TABLE `teraz` (
    `col` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

//

<?php 
$last_name = 77; 
$conn = new mysqli('localhost','root','','shopping'); 
$sql = "INSERT INTO teraz VALUES ('{$last_name}')"; 
$sql2 = "SELECT * FROM teraz"; 
$conn->query($sql); 
$result = $conn->query($sql2); 
$x = $result->fetch_assoc() ; 
echo $x['col']; 
?> 

+0

mysqliを使用している場合、プレースホルダ値を持つプリペアドステートメントを絶対に使用する必要があります。ここでも 'latin1'を使うのは悪い計画です、' utf8mb4'はかなり良いデフォルトですが、文字列がないのでここで指定するのは冗長です。 – tadman

関連する問題