Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则DBAL插入如果不';不存在_Php_Mysql_Symfony_Doctrine Orm_Dbal - Fatal编程技术网

Php 原则DBAL插入如果不';不存在

Php 原则DBAL插入如果不';不存在,php,mysql,symfony,doctrine-orm,dbal,Php,Mysql,Symfony,Doctrine Orm,Dbal,我将Symfony2框架与DBAL结合使用,并将一些数据插入MySql数据库。Insert看起来像这样(简化): 我想要实现的是普通sql所具有的功能。如果不存在插入功能,例如:insert IGNORE。但是有可能用DBAL做这样的事情吗 请注意,我在这里不使用对象 编辑:请注意,我使用的不是对象,而是DBAL描述的数组插入方法 Edit2:我尝试使用建议的try-catch来解决这个问题,除了一件事之外,它似乎工作得很好。即使没有添加新行,db也会自动递增主键。 以下是我使用的代码:

我将Symfony2框架与DBAL结合使用,并将一些数据插入MySql数据库。Insert看起来像这样(简化):

我想要实现的是普通sql所具有的功能。如果不存在插入功能,例如:
insert IGNORE
。但是有可能用DBAL做这样的事情吗

请注意,我在这里不使用对象

编辑:请注意,我使用的不是对象,而是DBAL描述的数组插入方法

Edit2:我尝试使用建议的try-catch来解决这个问题,除了一件事之外,它似乎工作得很好。即使没有添加新行,db也会自动递增主键。 以下是我使用的代码:

    try{
        $conn->insert('sometable', array(
            "col1"     => $data1,
            "col2"     => $data2,
            "col3"     => $data3
       ));
   } catch( \Exception $e) {
          switch (get_class($e)) {
               case 'Doctrine\DBAL\DBALException':
                   // No problems here. Just means that the row already existed.
                   break;
               default:
                   $this->get('logger')->error("(ERROR in ".__METHOD__.", @Row: ".(__LINE__)."): DB-error! error: ".$e->getMessage());
                   break;
          }
  }
我还必须对表进行多行唯一索引,因为我必须检查所有列是否相同。i、 e.如果整行与我们尝试插入的行相同


所以。。在其他情况下,它工作得很好,只是每次尝试插入捕捉时,自动增量值都会不断上升。我不认为这是一个真正的问题,但浪费数字让人觉得很愚蠢D

除了执行select查询并尝试检索行之外,我不知道有什么方法可以做到这一点,即:

$sql = "SELECT * FROM sometable WHERE ....";
$stmt = $conn->prepare($sql);
$stmt->bindParam(); //or bindValue...
$stmt->execute();

$exists = $stmt->fetch();

if(!$exists) {
    // insert or whatever..
} else {
    // do nothing? 
}
最终,你可能会附加一个能为你做到这一点的,但我不确定这是否适用于你的情况

或者,您可以创建一个唯一的约束,并在插入数据时执行try/catch。每当数据不唯一时,数据库就会返回一个错误,通常会收到一个
PDOException
,尽管在理论上我认为它的名称不同(检查)。只需捕获该异常,不做任何处理。例如:

try {
    $conn->insert('sometable', array(
        "col1"     => $data1,
        "col2"     => $data2,
        "col3"     => $data3
    ));
} catch(PDOException $e) {
   // do nothing. 
}

大家好,试试这个@Auris。请注意,我没有使用对象,而是使用了DBAL的数组插入方法。是的,这是我到目前为止一直在使用的方法,但是使用的是DBAL。首先检查,然后在必要时插入,但我希望在同一个命令中有此功能。这样就可以减少代码量,而且可能也不会花那么多时间。我一直在阅读DBAL文档,但是。。好。。吮吸我找不到任何关于使用DBAL执行“INSERT IGNORE”的信息。如果可以在表中设置
unique
列,则可以直接插入数据并执行
try{}catch(PDOException$e){}
或类似操作。因此,每当数据存在时,您只需捕获异常,而对其不做任何处理?嗯。。那可能行。。我以后再试试。谢谢你的提示!
try {
    $conn->insert('sometable', array(
        "col1"     => $data1,
        "col2"     => $data2,
        "col3"     => $data3
    ));
} catch(PDOException $e) {
   // do nothing. 
}