1

私には2つのWebページがあります。1つは情報を入力するWebページで、もう1つは情報を処理します。私の最初のページは、jQueryと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;
            }
        });
});

Webページの特定の部分に問題はなく、変数が送信されます。通知があれば、アラートダイアログで確認しており、すべての情報が有効で正しいものです。

問題はPHPWebページにあります。HTMLにspanタグがあり、エラーがある場合はそれを報告します。[送信]をクリックすると、次のように表示されます。

エラー:Array()

トランザクションが実行されない場合はそのエラー文字列を入力しますが、なぜ実行されないのかわかりません。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配列をすべての正しい値で出力します

何も文句を言っていないようですが、トランザクションはデータベースにコミットされていません。

一方、同じロジック、同じコードに従う他のWebページがあり、それらのページは期待どおりに機能します。

また、PDOを使用するのは初めてで、通常はMySQLiを使用していました。

4

1 に答える 1

3

PDOerrorInfoは、文字列ではなく配列を返します。var_exportまたはを使用print_rして文字列に変換します。


さらに、私の意見では、各クエリの結果をチェックするのではなく、クエリを実行できないときに例外をスローするようにPDOのエラーモードを設定することをお勧めします。次に、トランザクション全体をtry / catchでラップし、問題が発生した場合にトランザクションをロールバックできます。

于 2012-05-13T18:27:35.440 に答える