繁体   English   中英

SQL-交易更新2个表格

[英]SQL - Transaction update 2 tables

我有一个要求用户验证其电子邮件地址的表格,该链接以以下形式发送给用户

http://app.myurl.org/h/activate.php?email=useremail%40gmail.com&key=80fddb7fa21dd2e2639ae5ec82b9d511&api=8a2d01d7411ec2488307744ddf070a4d

将用户定向到激活页面。

我正在尝试从URL中获取emailkeyapi 然后,我试图同时更新用户表和名册表。

名单表列更新为Activation用户表列更新为groups它们都将MD5随机哈希的唯一值作为API KEY传递给整个网站。 一切运行顺利,只是没有查询。

有什么想法我做错了吗?

    <?php
include ('dbcon.php');
if (isset($_GET['email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/',
     $_GET['email'])) {
     $email = $_GET['email'];
    }
    if (isset($_GET['key']) && (strlen($_GET['key']) == 32))
     //The Activation key will always be 32 since it is MD5 Hash
     {
     $key = $_GET['key'];
    }
    if (isset($_GET['api']) && (strlen($_GET['api']) == 32))
     //The API key will always be 32 since it is MD5 Hash
     {
     $API = $_GET['api'];
    }
    if (isset($email) && isset($key)) {

     // Update the database to set the "activation" field to null

     $query_activate_account = "BEGIN TRANSACTION; 
                                UPDATE table_roster SET Activation=NULL WHERE(email ='$email' AND Activation='$key')LIMIT 1;
                                UPDATE table_users SET groups=[99] WHERE(pinAPP_API ='$API') LIMIT 1;
                                COMMIT";
     $result_activate_account = mysqli_query($dbc, $query_activate_account);

     // Print a customized message:
     if (mysqli_affected_rows($dbc) == 1) //if update query was successful
     {
     echo '<div>You may now proceed.</div>';

     } else {
     echo '<div>Oops !You could not be validated. Please recheck the link or contact your hiring manager.</div>';

     }

     mysqli_close($dbc);

    } else {
     echo '<div>An Error Occurred.</div>';
    }
    ?>

我在SO上进行了一些搜索,以通过一个事务更新两个表,因此建议使用BEGIN TRANSACTION; UPDATE... UPDATE... COMMIT; BEGIN TRANSACTION; UPDATE... UPDATE... COMMIT; 但是我遇到了故障,并且我的预定义错误消息是An Error Occurred

您必须使用mysqli_multi_query而不是mysqli_query

此外,您还必须启动事务并使用单独的查询提交或回滚它。

mysqli_query($dbc, "START TRANSACTION");

$result_activate_account = mysqli_multi_query(
    $dbc,
    "UPDATE table_roster SET Activation=NULL WHERE (email ='$email' AND Activation='$key') LIMIT 1;
     UPDATE table_users SET groups=[99] WHERE (pinAPP_API ='$API') LIMIT 1;"
);

if ($result_activate_account !== false) {
    mysqli_query($dbc, "COMMIT");

    echo '<div>You may now proceed.</div>';
} else {        
    mysqli_query($dbc, "ROLLBACK");

    echo '<div>Oops !You could not be validated. Please recheck the link or contact your hiring manager.</div>';
}

您不应该一次使用多个查询。 mysqli提供了用于事务的功能,尽管它们仅与MySQL 5.6及更高版本一起使用:

 mysqli_begin_transaction($dbc);
 mysqli_query($dbc, "UPDATE table_roster SET Activation=NULL WHERE(email ='$email' AND Activation='$key')LIMIT 1");
 mysqli_query($dbc, "UPDATE table_users SET groups=[99] WHERE(pinAPP_API ='$API') LIMIT 1");
 mysqli_commit($dbc);

另外,请查看准备好的语句并绑定这些值,而不是直接使用它们。

最终得到以下

if (isset($email) && isset($key)) {
    mysqli_query($dbc);
    $verified = mysqli_query($dbc,"
       UPDATE tbl_users t1, tbl_roster t2 SET t1.groups='[22]', t2.prescreen='0' WHERE t1.API='$API' AND t2.API='$API' AND t2.prescreen='$key';
    ");
    if ($verified !== false) {
        mysqli_query($dbc);
        echo '<br><center><div class="success"></div>';

    } 
    else {
        mysqli_query($dbc);
        echo '<br><div class="validation"></div>';
    }
    mysqli_close($dbc);
  } else {
    echo '<br><div class="error">An Error Occurred.</div>';
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM