2016-10-03 7 views
1

PHP OOPを使用してカスタムCMSを作成しています。基本的に私はdbに新しい行を追加できるクラスを作っています。DB内に行が存在しないときにPHP OOPでクエリを挿入

私のクラス:

<?php 
class Navigation 
{ 
    private $db; 

    public function __construct() 
    { 
     $this->db = new Connection(); 
     $this->db = $this->db->dbConnect(); 
    } 

    public function NewMenu($menu_name,$menu_numbers) 
    { 
     if (!empty($menu_name) && !empty($menu_numbers)) { 
      $sql = "INSERT INTO menu_nav " 
       . "(menu_name, menu_items) VALUES (?, ?)"; 
      $ins = $this->db->prepare($sql); 

      $ins->bindParam(1,$menu_name); 
      $ins->bindParam(2,$menu_numbers); 
      $ins->execute(); 
     } else { 
      header("Location: maint/php/includes/errors/009.php"); 
      exit(); 
     } 
    } 
} 

このクラスでは、正常に動作しますが、問題は、私はmenu_nameがテーブルにすでに存在しているかいないかどうかを確認する方法がわからないということです。また、「はい」の場合は、「データをdbに挿入できません」というエラーメッセージが表示されます。 PHP OOPでこの機能を実行する方法を知っているなら、本当に必要な理由を教えてください。

+2

[mysqlデータベースへの重複エントリを避けるための最良の方法](http://stackoverflow.com/questions/2219786/best-way-to-avoid-duplicate-entry -into-mysql-database) –

+0

あなたの質問は本当に_general_でMySQLの重複したエントリを処理する方法に関するものなので、これを重複として投票しました。使用しているPHPラッパーはこのAFAIKを変更しません。 –

+0

私はOPが以前に入力した行を見つける方法を探していると思います。部分的に質問は類似しているかもしれませんが、解決策は提供されたものとはかなり異なっています。 OPはレコードが存在するかどうかを見つけるためにデータベースに別の要求をしなければならない。 – Samundra

答えて

2

これには2通りの方法があります。最初の方法では、プライマリ/ユニークキーが必要になり、クエリが失敗する可能性があります。障害時に例外をスローしてPDOを設定し、例外メッセージで「重複キー」を確認できます。あなたは、このような接続オプションを変更する必要があると思います。これを行うために
[1]:は

$dsn = "mysql:host=$host;dbname=$db;charset=$charset"; 
$opt = [ 
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
    PDO::ATTR_EMULATE_PREPARES => false, 
]; 
$pdo = new PDO($dsn, $user, $pass, $opt); 

その後pdo::exec()ではなく、ただfalseを返すの例外がスローされます。

第2の方法では、DBを最初に照会し、0行が戻された場合に挿入する必要があります。このアプローチの問題は、競合状態を引き起こす可能性があることです。チェックとINSERTクエリーとの間に、重複した行が別の同時に実行されているスクリプトによって挿入されます。

だから私は最初のやり方でそれをやることをお勧めします。とにかくそれをやる必要があるので、競争条件を捕まえる。

PS:方法1を実行する別の方法として、SQLクエリでON DUPLICATE KEYを使用できます。データを挿入または更新する場合。

[1]:ここhttps://phpdelusions.net/pdo

0

からコピーあなたが行がテーブルに存在するかどうかを確認し、(私が正しくあなたの質問を理解していれば)行が存在しない場合にのみ、データを挿入する必要があります。最初に指定されたメニュー名$ins = $this->db->prepare("SELECT FROM menu_nav (menu_name, menu_items) VALUES (?, ?)");の行を選択し、データがあるかどうかを確認します。 go here、手がかりを得る)

+1

私の答えで述べたように、残念なことに競合状態に脆弱です。 – ChristianF

+0

はい、あなたのアプローチはより良いです) – heavymetal91

関連する問題