我正在使用PDO插入记录(mysql和php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
有没有办法知道它是否成功插入,例如,如果没有插入记录,因为它是重复的?
编辑:我当然可以查看数据库,但我的意思是程序化反馈。
答案 0 :(得分:116)
PDOStatement->execute()
成功时返回true。您还可以PDOStatement->errorCode()
检查错误。
答案 1 :(得分:22)
不知道为什么仍没有正确答案。
鉴于PDO的大多数建议错误模式为Loop Until
,无法直接ERRMODE_EXCEPTION
结果验证。因为代码执行甚至不会达到其他答案中提供的条件。
因此,在PDO中处理插入操作的结果有三种可能的方案:
execute()
运算符。对于普通的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