【问题标题】:Unable to insert into two different tables with help of transactions [closed]无法在事务的帮助下插入两个不同的表[关闭]
【发布时间】:2020-08-16 14:14:03
【问题描述】:

下面是我写的代码,我试图在事务的帮助下将数据插入两个不同的表,但代码没有执行。非常努力地找出问题,但无法解决。

我收到此错误:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 ''u_id_fk','device_type','ip_num','package','pkg_id_fk') VALUES('79','abc','128.1 附近使用正确的语法' 在第 1 行 []

                $cust_name = 'multi';
                $u_name = 'multi2';
                $cnic_num = '421';
                $address = 'sadaddd';
                $password = md5('423423'); 
                $cellnum='43243';
                $p_id_fk=(int)'3';



                    try {
                            // First of all, let's begin a transaction
                            $conn->beginTransaction();
                            // If we arrive here, it means that no exception was thrown
                            // i.e. no query has failed, and we can commit the transaction
                             // Forgot to close the VALUES bracket and couldn't find your $email
                            $users_stmt=$conn->prepare("INSERT INTO users (`cust_name`, `u_name`, `cnic`, `address`, `password`, `email`) VALUES (:cust_name, :u_name, :cnic, :address, :password, :email)");
                            // PDO::execute() can accept an array of parameter bound to your query so you may avoid selecting data type when using bindParam()
                           $users_stmt->execute(["cust_name"=>$cust_name, "u_name"=>$u_name, "cnic"=>$cnic_num, "address"=>$address, "password"=>$password, "email"=>$email]);
                            // Not sure if $db is a PDO object...
                            $connections_stmt=$conn->prepare("INSERT INTO connections('u_id_fk','device_type','ip_num','package','pkg_id_fk') VALUES(:u_id_fk,:device_type,:ip_num,:package,:pkg_id_fk)");
                            $connections_stmt->execute(["u_id_fk"=>$u_id,"device_type"=>$device_type,"ip_num"=>$ip_num,"package"=>$package,"pkg_id_fk"=>$p_id_fk]);


                            $conn->commit();
                        } catch (Exception $e) 
                        {
                            // An exception has been thrown
                            // We must rollback the transaction
                            $conn->rollback();
                            echo $e;
                        }   

请帮忙解决!谢谢

【问题讨论】:

  • 执行后有错误吗?
  • Catch 块没有显示任何错误,只是浏览器给出了 http 错误 500
  • 您是否尝试过保存而不使用仅用于测试的事务?
  • 您可以尝试使用if 来检查您的语句是否正确执行,$stmt - 成功时返回 TRUE,失败时返回 FALSE。检查这个:php.net/manual/en/pdostatement.execute.php
  • 你检查过服务器错误日志吗?

标签: php mysql sql mysqli transactions


【解决方案1】:

在连接过程中将PDO错误模式设置为EXCEPTION非常重要。

避免对密码使用简单的哈希算法,因为它可以使用 Rainbow Attack 提取。

$cust_name = 'multi';
$u_name = 'multi2';
$cnic_num = '421';
$address = 'sadaddd';
$password = md5('423423'); 
$cellnum='43243';
$p_id_fk=(int)'3';

try {
    // DB vars
    $db_host="";
    $db_name="";
    $db_username="";
    $db_password="";

    // Create a new PDO connection and set error mode to EXCEPTION
    $conn=new PDO("mysql:host=".$db_host.";dbname=".$db_name,$db_username,$db_password,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

    $conn->beginTransaction();

    // Forgot to close the VALUES bracket and couldn't find your $email
    $users_stmt=$conn->prepare("INSERT INTO users (`cust_name`, `u_name`, `cnic`, `address`, `password`, `email`) VALUES (:cust_name, :u_name, :cnic, :address, :password, :email)");
    // PDO::execute() can accept an array of parameter bound to your query so you may avoid selecting data type when using bindParam()
    $users_stmt->execute(["cust_name"=>$cust_name, "u_name"=>$u_name, "cnic"=>$cnic_num, "address"=>$address, "password"=>$password, "email"=>$email]);
    $connections_stmt=$conn->prepare("INSERT INTO connections(`u_id_fk`,`device_type`,`ip_num`,`package`,`pkg_id_fk`) VALUES(:u_id_fk, :device_type, :ip_num, :package, :pkg_id_fk)");
    $connections_stmt->execute(["u_id_fk"=>$u_id, "device_type"=>$device_type, "ip_num"=>$ip_num, "package"=>$package, "pkg_id_fk"=>$p_id_fk]);

    $conn->commit();
} catch (Exception $e){ 
    $conn->rollback();
    echo $e->getMessage();
}

【讨论】:

  • 嗨,我根据你的回答修改了你的代码,但它给了我一个错误。我已经更新了有问题的代码。请看一下。谢谢
  • 请不要回显错误信息。
  • 回显错误信息有什么缺点?
  • @JahanzaibNiazi 您收到该错误是因为您将列名括在单引号 (') 中,而不是反引号或重音符 (`)。我已更新我的答案以解决该错误。
【解决方案2】:

你的第一个语句中的右双引号不正确,它必须在它的末尾,而且你错过了准备函数的结束括号

 $stmt=$conn->prepare("INSERT INTO users (cust_name, u_name,cnic,address,password,email) VALUES (?, ?, ?, ?, ?, ?)");

试着改正那个错字。

【讨论】:

猜你喜欢
  • 2012-02-27
  • 2013-03-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多