2015-01-26 90 views
0

我最近发布了一个question关于删除数据库中的多行,基本上重新使用代码来更新数据库中的多行,但现在一旦数据库有问题已更新和页面刷新它保持我登出我不知道为什么。在PHP中更新数据库后保持注销状态

这里是AJAX:

function editUser(){ 

    var url = 'edit-user.php'; 
    var ids = document.getElementById("edit-user-id").value; 
    var role = document.getElementById("role").value; 
    var status = document.getElementById("accountStatus").value; 
    var data = 'userID=' + ids.toString() + '&role=' + role + '&status=' + status; 

    $.ajax({ 
      url: url, 
      data: data, 
      cache: false, 
      error: function(e){ 
        alert(e); 
       }, 
      success: function() { 
       var selects = $('#users-table').bootstrapTable('getSelections'); 
        ids = $.map(selects, function (row) { 
         return row.id; 
        }); 
       $('#users-table').bootstrapTable('refresh', { 
        silent: true 
       }); 
       location.reload();     
      } 
      }); 

    } 

这里是PHP:

require("../config.php"); 
try{ 
    $role = $_GET['role']; 
    $status = $_GET['status']; 
    $ids = array($_GET['userID']); 
    $inQuery = implode(',', $ids); 
    $query = 'UPDATE users SET role = :role, account_status = :status WHERE user_id IN ('.$inQuery.')'; 
    $query_params = array( 
     ':role' => $role, 
     ':status' => $status 
    ); 
    $stmt = $db->prepare($query); 
    $stmt->execute($query_params); 
    // Set variable message of affected rows 
    $count = $stmt->rowCount(); 
    $user_updated = ''.$count.' user(s) updated successfully.'; 
    $_SESSION['user_updated'] = $user_updated; 
} catch (Exception $e){ 
    $error = '<strong>The following error occured:</strong>'.$e->getMessage(); 
    $_SESSION['error'] = $error; 
} 

我试图改变cache: true,但没有奏效。再次,我不想被注销。任何想法我做错了什么?

编辑:我缩小了它只发生在页面刷新时。我从ajax调用中删除了这段代码location.reload();,它不会将我重定向回登录页面,但如果我点击F5或单击刷新,则会将我注销。

+1

你会在你的PHP文件的顶部调用session_start()吗?我没看到它。 – 2015-01-26 22:48:31

+0

在我的'config.php'文件的底部我有'session_start()'。 ajax和php是两个独立的文件,它们都有'config.php'文件 – iamthestreets 2015-01-26 23:27:13

+0

@iamthestreets,可能需要看看你是如何进行身份验证才能看到问题可能是什么。 – Devon 2015-01-27 02:00:50

回答

0

看起来我需要将session_start()移动到config.php文件的顶部,以确保它是页面上首先调用的第一个东西。现在一切似乎都很顺利。

0

这是一个评论太长:我

没有什么是跳出会导致你失去什么在$_SESSION['user']设置。尝试在每个页面上倾销$_SESSION,以便跟踪它并立即禁用重定向(只需输入错误消息或其他内容)。你可以转储阵列像这样:

print_r($_SESSION);

你也知道你准备语句是坏了?我没有看到阵列的点或者$ids$inQuery的内爆点。它应该是这样的:

$stmt = $db->prepare(
    'UPDATE users 
    SET role = ?, account_status = ? 
    WHERE user_id = ?' 
); 
$stmt->execute(array($_GET['role'], $_GET['status'], $_GET['userID'])); 

有使用IN如果你只有一个入口是没有意义的。您也无法保护您的查询,因为您仍将值插入到准备语句中。

+0

谢谢!我会试一试''__SESSION'转储。我确实有多个值,但它也可以是一个值。这就是我使用'IN'的原因。我传递了表中选定的所有userids的参数,然后更新每个用户。 – iamthestreets 2015-01-27 18:18:17

+0

所以'$ _GET ['userID']'是一个数组?因为'$ ids = array($ _ GET ['userID']); $ inQuery = implode(',',$ ids);'永远不会工作。你在'$ ids'中只用一个元素定义了一个数组,然后将它打乱,它只是在没有任何改变的情况下返回'$ _GET ['userID']'。 – Devon 2015-01-27 18:31:06

+0

@iamthestreets:这里是我正在谈论的沙盒示例:http://sandbox.onlinephpfunctions.com/code/d97343f33e5d7cc0799caa385546acf9a3eb9efd。它实际上根本不会返回userid数组,它会打破它,因为它需要一个单维数组。 – Devon 2015-01-27 18:42:07

相关问题