首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -事务更新2表

SQL -事务更新2表
EN

Stack Overflow用户
提问于 2015-12-10 08:07:02
回答 3查看 72关注 0票数 1

我有一个表单,要求用户验证他们的电子邮件地址,链接发送给用户

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

用户被定向到激活页面。

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

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

知道我哪里出问题了吗?

代码语言:javascript
复制
    <?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>';
    }
    ?>

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-20 21:16:40

以下列方式结束

代码语言:javascript
复制
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>';
}
票数 0
EN

Stack Overflow用户

发布于 2015-12-10 08:09:27

您必须使用查询而不是mysqli_query

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

代码语言:javascript
复制
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>';
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-10 08:39:19

您不应该同时使用多个查询。mysqli为事务提供了功能,它们仅适用于MySQL 5.6及以上版本:

代码语言:javascript
复制
 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);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34196632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档