PDO mysql:如何知道插入是否成功

时间:2009-11-02 15:14:29

标签: php mysql database pdo

我正在使用PDO插入记录(mysql和php)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();

有没有办法知道它是否成功插入,例如,如果没有插入记录,因为它是重复的?

编辑:我当然可以查看数据库,但我的意思是程序化反馈。

7 个答案:

答案 0 :(得分:116)

PDOStatement->execute()成功时返回true。您还可以PDOStatement->errorCode()检查错误。

答案 1 :(得分:22)

不知道为什么没有正确答案。

鉴于PDO的大多数建议错误模式为Loop Until无法直接ERRMODE_EXCEPTION结果验证。因为代码执行甚至不会达到其他答案中提供的条件。

因此,在PDO中处理插入操作的结果有三种可能的方案:

  1. 要说明成功,不需要验证。请保持您的计划流程。
  2. 要处理意外错误,保持相同的 - 不需要立即处理代码。如果发生数据库错误,将抛出异常,并且它将冒泡到站点范围的错误处理程序,最终将导致共同的500错误页面。
  3. 要处理预期的错误,例如重复的主键,,如果您有某个方案来处理此错误,请使用execute()运算符。
  4. 对于普通的PHP用户来说,这听起来有些陌生 - 怎么样,不验证操作的直接结果? - 但这就是例外的工作原理 - 您可以在其他地方检查错误。一次就好。非常方便。

    因此,在常规情况下,您根本不需要任何处理代码。保持您的代码不变:

    try..catch

    成功时它会告诉你,如果出错,它会显示你的应用程序为这种场合显示的常规错误页面。

    仅在您有处理方案的情况下,而不仅仅是报告错误,请将您的insert语句放在$stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); echo "Success!"; // whatever 运算符中,检查它是否是您预期的错误并处理它;或 - 如果错误有任何不同 - 重新抛出异常,则可以通过常规方式由站点范围的错误处理程序处理。以下是我article on error handling with PDO的示例代码:

    try..catch

    在上面的代码中,我们正在检查特定错误以采取某些操作并重新抛出任何其他错误(例如,没有这样的表)的异常,这将报告给程序员。

    再次 - 只是告诉用户类似“你的插入成功”无需任何条件。

答案 2 :(得分:9)

尝试查看execute的返回值,成功时为TRUE,失败时为FALSE

答案 3 :(得分:8)

如果使用与当前数据库记录匹配的值执行更新查询,则$stmt->rowCount()将返回0,因为没有行受到影响。如果您有if( rowCount() == 1 )来测试成功,您会认为更新失败但没有失败但是数据已经在数据库中,所以没有任何变化。

$stmt->execute();
if( $stmt ) return "success";

当我尝试使用违反的唯一键字段更新记录时,这对我不起作用。查询返回成功,但另一个查询返回旧字段值。

答案 4 :(得分:3)

您可以测试行数

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }

答案 5 :(得分:0)

PDOStatement-> execute()可以抛出异常

所以你能做的就是

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}

答案 6 :(得分:0)

使用id作为自动增量的主键

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";

增量id总是大于零,即使在第一个记录上也是如此,这意味着它总是会返回一个真值,因为大于零的id coz在PHP中表示为真

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

    # Webserver, jobserver and message queue VM
    config.vm.define "app", primary: true do |app|

        app.vm.box = "ubuntu/trusty64"
        app.vm.hostname = "app.restream.vm"
        app.vm.synced_folder ".", "/vagrant", disabled: true
        app.vm.synced_folder ".", "/var/www/app"
        app.vm.synced_folder "../infra", "/var/www/infra"
        app.vm.synced_folder "../widgetcodebucket", "/var/www/widgetcodebucket"
        app.vm.network "private_network", ip: "10.10.10.90"

        app.vm.provider "virtualbox" do |vb|
            vb.gui = false
            vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
            vb.customize ["modifyvm", :id, "--memory", "4096"]
            vb.customize ["modifyvm", :id, "--cpus", "4"]
        end

        app.vm.provision "ansible" do |ansible|
            ansible.host_key_checking = false
            ansible.limit = 'all'
            #ansible.verbose = 'vvvv'
            ansible.inventory_path = '../infra/hosts-dev'
            ansible.playbook = "../infra/vm.yml"
            ansible.extra_vars = {
                symfony_env: 'dev',
                ansible_ssh_user: 'vagrant',
                nginx_user: 'vagrant',
                redis_ip: '127.0.0.1',
                redis_port: 6379,
                git_branch: "develop"
            }
        end
    end

    # Statistics and monitoring VM
    config.vm.define "stats" do |stats|
        stats.vm.box = "ubuntu/trusty64"
        stats.vm.hostname = "stats.restream.vm"
        stats.vm.synced_folder ".", "/vagrant", disabled: true
        stats.vm.synced_folder "../infra", "/var/www/infra"
        stats.vm.network "private_network", ip: "10.10.11.11"

        stats.vm.provider "virtualbox" do |vb|
            vb.gui = false
            vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
            vb.customize ["modifyvm", :id, "--memory", "4096"]
            vb.customize ["modifyvm", :id, "--cpus", "4"]
        end

        stats.vm.provision "ansible" do |ansible|
            ansible.limit = 'all'
            ansible.host_key_checking = false
            #ansible.verbose = 'vvvv'
            ansible.inventory_path = '../infra/hosts-dev'
            ansible.playbook = "../infra/stats.yml"
            ansible.extra_vars = {
                symfony_env: 'dev',
                ansible_ssh_user: 'vagrant',
                graphite_db_name: 'graphite',
                graphite_db_engine: 'django.db.backends.mysql',
                graphite_db_user: 'root',
                graphite_db_pass: 'root',
                graphite_db_host: '127.0.0.1',
                graphite_db_port: 3306
            }
        end
    end

end