PHP PDO Module 不提交事务,不上报原因

Posted

技术标签:

【中文标题】PHP PDO Module 不提交事务,不上报原因【英文标题】:PHP PDO Module doesn't commit transaction and fails to report the reason 【发布时间】:2012-05-21 09:21:03 【问题描述】:

我有两个网页,一个用于填写信息,另一个用于处理信息。 我的首页是简单的带有 jQ​​uery 和 AJAX 的 html,只要用户单击一个按钮,它就会执行以下代码:

$("#registrar-tienda").click(function() 
    var categoria = $("#categoria").val();
    var nombre = $("#nombre").val();
    var direccion = $("#direccion").val();
    var codigo_postal = $("#codigo").val();
    var poblacion = $("#poblacion").val();
    var provincia = $("#provincia").val();
    var latitud = $("#latitud").val();
    var longitud = $("#longitud").val();
    var telefono = $("#telefono").val();
    var categoria = $("#categoria").val();
    var email = $("#email").val();
    var web = $("#web").val();
    var eco_punto = $("#eco-punto").val();
    var compra_minima = $("#compra-minima").val();
    var maximo_acumulable = $("#maximo-acumulable").val();
    var cliente_hash = $("#cliente-hash").val();
    alert(nombre+direccion+codigo_postal+poblacion+provincia+latitud+longitud+telefono+email+web+eco_punto+compra_minima+maximo_acumulable+cliente_hash);
    $.ajax(
        type:"POST",
        url:"modulos/tiendas/operaciones.php",
        data:categoria:categoria,nombre:nombre,direccion:direccion,codigo_postal:codigo_postal,poblacion:poblacion,provincia:provincia,latitud:latitud,longitud:longitud,telefono:telefono,categoria:categoria,email:email,web:web,eco_punto:eco_punto,compra_minima:compra_minima,maximo_acumulable:maximo_acumulable,cliente_hash:cliente_hash
        ).done(function(msg) 
        if(msg == "Tienda agregada") 
            document.location.reload(true);
         else 
            document.getElementById("errores").innerHTML = msg;
            
        );
);

我对网页的特定部分没有任何问题,它会发送变量,如果通知我正在通过警报对话框确认,并且所有信息都是有效且正确的。

问题来自于 PHP 网页, 我的 HTML 中有一个 span 标签,如果有错误,它会报告错误。 当我点击提交时,它只显示:

错误:数组()

如果事务没有执行,我就放那个错误字符串,但是不知道为什么没有执行,errorInfo()方法只报:Array()

我的PHP代码如下:

<?php
require('../../includes/etc/connection.php');
isset($_POST['categoria']) or die ("No hay categoria definida");
isset($_POST['nombre']) or die("No hay nombre de negocio");
isset($_POST['direccion']) or die("No hay direccion de negocio");
isset($_POST['poblacion']) or die ("No hay poblacion de negocio");
isset($_POST['codigo_postal']) or die("No hay codigo postal de negocio");
isset($_POST['provincia']) or die("No hay provincia");
isset($_POST['latitud']) or die("No hay latitud");
isset($_POST['longitud']) or die("No hay longitud");
isset($_POST['telefono']) or die("Sin telefono");
isset($_POST['categoria']) or die("No hay categoria");
isset($_POST['eco_punto']) or die("No hay valor del ecopunto");
isset($_POST['maximo_acumulable']) or die("No hay maximo acumulable");
isset($_POST['compra_minima']) or die("No hay compra minima");
isset($_POST['cliente_hash']) or die("Se tiene que seleccionar un cliente");

if($_POST['nombre'] == "Nombre del establecimiento"): die(0); endif;
if($_POST['direccion'] == "Direccion"): die(0); endif;
if($_POST['poblacion'] == "Poblacion"): die(0); endif;
if($_POST['codigo_postal'] == "Codigo Postal"): die(0); endif;
if($_POST['provincia'] == "Provinicia"): die(0); endif;
if($_POST['telefono'] == "Telefono"): die(0); endif;
if($_POST['email'] == "E-mail"): die(0); endif;

$hash = md5($_POST['nombre'].$_POST['latitud'].$_POST['longitud'].date("Y-m-d H:M:s"));
$fecha_registro = date("Y-m-d");
$strSQL = "INSERT INTO `negocios`(`hash`,`cliente_hash`,`fecha_registro`,`nombre`,`apellido`,`direccion`,`codigo_postal`, `poblacion`, `provincia`, `latitud`,`longitud`,`telefono`, `email`, `web`,`categoria`,`valor_ecopunto`,`maximo_acumulable`,`compra_minima`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 
if(!($sth = $dbh->prepare($strSQL))) 
    die("Statement not prepared:".$dbh->errorInfo());


if(!$dbh->beginTransaction())
    die ("Transaction didn't begin: ".$dbh->errorInfo());


$sth->bindParam(1,$hash,PDO::PARAM_STR,32) or die("Not binded");
$sth->bindParam(2,$_POST['cliente_hash'],PDO::PARAM_STR,32) or die("Not binded");
$sth->bindParam(3,$_POST['fecha_registro'],PDO::PARAM_STR,15) or die("Not binded");;
$sth->bindParam(4,$_POST['nombre'],PDO::PARAM_STR,150) or die("Not binded");;
$sth->bindParam(5,$_POST['direccion'],PDO::PARAM_STR,150) or die("Not binded");;
$sth->bindParam(6,$_POST['codigo_postal'],PDO::PARAM_INT,9) or die("Not binded");;
$sth->bindParam(7,$_POST['poblacion'],PDO::PARAM_STR,50) or die("Not binded");;
$sth->bindParam(8,$_POST['provincia'],PDO::PARAM_STR,50) or die("Not binded");;
$sth->bindParam(9,$_POST['latitud'],PDO::PARAM_STR,10) or die("Not binded");;
$sth->bindParam(10,$_POST['longitud'],PDO::PARAM_STR,10) or die("Not binded");;
$sth->bindParam(11,$_POST['telefono'],PDO::PARAM_STR,20) or die("Not binded");;
$sth->bindParam(12,$_POST['email'],PDO::PARAM_STR,100) or die("Not binded");;
$sth->bindParam(13,$_POST['web'],PDO::PARAM_STR,100) or die("Not binded");;
$sth->bindParam(14,$_POST['categoria'],PDO::PARAM_INT,2) or die("Not binded");;
$sth->bindParam(15,$_POST['eco_punto'],PDO::PARAM_INT,4) or die("Not binded");;
$sth->bindParam(16,$_POST['maximo_acumulable'],PDO::PARAM_INT,4) or die("Not binded");;
$sth->bindParam(17,$_POST['compra_minima'],PDO::PARAM_INT,5) or die("Not binded");;
if(!$sth->execute())
    die("Error: ".$sth->errorInfo());  // Error reported in the HTML webpage

$dbh->commit();
echo "Tienda Agregada";
?>

起初我以为我没有收到 POST 变量,但如果我添加:

print_r($_POST);

它使用所有正确的值打印 POST 数组

它似乎没有抱怨什么,但是事务没有提交到数据库。

另一方面,我有其他网页遵循相同的逻辑、相同的代码,并且这些网页按预期工作。

我也是第一次用PDO,平时用的是mysqli

【问题讨论】:

PDO 的 errorInfo 返回一个数组,而不是字符串。使用var_exportprint_r 将其转为字符串。 天哪...我在 PHP.net 中阅读了 PDO errorInfo 网页,但我从未意识到它返回的是一个数组,而不是一个字符串...我觉得很愚蠢。感谢您指出这一点!您能否将其发布为答案并将其选为最佳答案? 【参考方案1】:

PDO 的errorInfo 返回一个数组,而不是字符串。使用var_exportprint_r 将其转为字符串。


另外,在我看来,当查询无法执行时,set PDO's error mode to throw exceptions 是个好主意,而不是检查每个查询的结果。然后,您可以将整个事务包装在 try/catch 中,并在出现问题时回滚事务。

【讨论】:

以上是关于PHP PDO Module 不提交事务,不上报原因的主要内容,如果未能解决你的问题,请参考以下文章

PDO / PHP / MySQL 中的性能:事务与直接执行

PHP PDO 事务与自动提交

PHP PDO 基础知识

PHP PDO 事务?

PDO:事务不回滚?

PHP的PDO