【问题标题】:Reading a session variable to write to the database读取会话变量以写入数据库
【发布时间】:2013-02-01 08:11:40
【问题描述】:

如果有人能帮我解决这个问题,我将不胜感激 - 我几乎可以正常工作了!

基本上,我正在制作自己的应用程序想法一段时间,我这样做的原因是因为我是编码新手,所以我觉得它会教我很多关于不同元素的知识(即添加、更新并删除记录)。

因此,在此示例中,我有一个用户成功登录,它正在创建一个会话,该会话正在通过其他表单传递。我希望他们能够添加一笔交易——我几乎已经完成了,但似乎在其中一个部分挣扎。

我的 HTML 代码是:

<!DOCTYPE html>
<html>
<head>
<title>Find A Deal</title>
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0"/>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<link rel="stylesheet" href="http://localhost/findadeal/themes/deal.css" />
<style>
    #login-button {
        margin-top: 30px;
    }        
</style>
<script src="http://www.dragan-gaic.info/js/jquery-1.8.2.min.js"></script>    
<script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
<script src="js/custom3.js"></script>
<script src="js/custom4.js"></script>

       <?php
    if( !isset( $_SESSION ) ){
     session_start();
        }

    if( isset( $_SESSION['username'] ) ){
      /* User is logged in */
      echo "IT WORKS!";
        } ?>

</head>


<body>
<div data-role="page" id="login">
    <div data-theme="a" data-role="header">
        <h3>Find A Deal</h3>
    </div>

    <div data-role="content">

        <label for="username">Enter your username:</label>
        <input type="text" value="" name="username" id="username"/>
        <label for="password">Enter your password:</label>
        <input type="password" value="" name="password" id="password"/>  
        <a data-role="button" id="login-button" data-theme="b">Login</a>
    </div>

    <div data-theme="a" data-role="footer" data-position="fixed">

    </div>
</div>

<!--Newly rendered page after successful login!-->

<div data-role="page" id="index">
    <div data-theme="a" data-role="header">
        <h2>Find A Deal</h2>
    </div>

    <div data-role="content">

           <?php
    if( !isset( $_SESSION ) ){
     session_start();
        }

    if( isset( $_SESSION['username'] ) ){
      echo "IT WORKS!";
        } ?>


    <h3></h3>
    <a href="#view" data-role="button" data-icon="search">View Deals</a>
    <a href="#add" data-role="button" data-icon="plus">Add Deals</a>

    </div>
</div>

<!--View Deal Page-->

    <div data-role="page" id="view">
    <div data-role="header">
        <h2>Find A Deal</h2>
    </div>

    <div data-role="content">

           <?php
    if( !isset( $_SESSION ) ){
     session_start();
        }

    if( isset( $_SESSION['username'] ) ){
      echo "IT WORKS!";
        } ?>


    <h3></h3>
    <p>test so I know I'm onto a new page</p>
    <a href="#view" data-role="button" data-icon="search">View Deals</a>
    <a href="#add" data-role="button" data-icon="plus">Add Deals</a>
    </div>

<div data-role="footer">

</div>
</div>

<!--Add Deal Page-->

    <div data-role="page" id="add">
    <script src="js/custom4.js"></script>
    <div data-role="header">
        <h2>Find A Deal</h2>
    </div>

    <div data-role="content">

           <?php
    if( !isset( $_SESSION ) ){
     session_start();
        }

    if( isset( $_SESSION['username'] ) ){
        echo "It's working!";
        } ?>

    <label for="name">Deal Name:</label>
        <input type="text" value="" name="name" id="name"/>
        <label for="desc">Description</label>
        <input type="text" value="" name="desc" id="desc"/>  
        <a data-role="button" id="submit-button" data-theme="b">Submit</a>
    </div>





</div>
</body>
</html>

所以只是为了解释一下 - 第一页是登录页面,它会将您带到索引旁边,这只是我设置的菜单页面,然后您可以从菜单中选择 2 个页面中的 1 个 - 查看交易和添加交易。我正在处理一项附加交易。

添加交易时,用户在相关文本框中输入交易名称和描述,以便将其添加到数据库中。 我正在使用这个 JS 函数:

//Adding a new deal

$(document).on('pagebeforeshow', '#add', function(){ 
 $('#submit-button').on('click', function(){
    if($('#name').val().length > 0 && $('#desc').val().length > 0){
        userObject.name = $('#name').val(); // Put username into the object
        userObject.desc = $('#desc').val(); // Put password into the object
        // Convert an userObject to a JSON string representation
        var outputJSON = JSON.stringify(userObject);
        // Send data to server through ajax call
        // action is functionality we want to call and outputJSON is our data
        ajax.sendRequest({action : 'add', outputJSON : outputJSON});
    } else {
        alert('Please fill all nececery fields');
    }
 });    
});

$(document).on('pagebeforeshow', '#index', function(){ 
if(userObject.name.length == 0){ // If username is not set (lets say after force page refresh) get us back to the login page
    $.mobile.changePage( "#add", { transition: "slide"} ); // In case result is true change page to Index  
}
$(this).find('[data-role="content"] h3').append('Deal Added:' + userObject.name); // Change header with added message
//$("#index").trigger('pagecreate');
});

// This will be an ajax function set
var ajax = {
sendRequest:function(save_data){
    $.ajax({url: 'http://localhost/findadeal/login/json3.php',
        data: save_data,
        async: true,
        beforeSend: function() {
            // This callback function will trigger before data is sent
            $.mobile.showPageLoadingMsg(true); // This will show ajax spinner
        },
        complete: function() {
            // This callback function will trigger on data sent/received complete
            $.mobile.hidePageLoadingMsg(); // This will hide ajax spinner
        },
        success: function (result) {
            if(result == "true") {
                $.mobile.changePage( "#index", { transition: "slide"} ); // In case result is true change page to Index
            } else {
                alert('Deal Addition has been unsuccessful, please try again!'); // In case result is false throw an error
            }
            // This callback function will trigger on successful action
        },
        error: function (request,error) {
            // This callback function will trigger on unsuccessful action                
            alert('Error has occurred, please try again!');
        }
    });
}
}

// We will use this object to store username and password before we serialize it and send to server. This part can be done in numerous ways but I like this approach because it is simple
var userObject = {
name : "",
desc : ""
}

然后这将被提供给一个 PHP 文件,准备将输入写入数据库,如下所示:

<?php

$var1 = $_REQUEST['action']; // We dont need action for this tutorial, but in a complex code you need a way to determine ajax action nature
$jsonObject = json_decode($_REQUEST['utputJSON']); // Decode JSON object into readable PHP object

$name = $jsonObject->{'name'}; // Get name from object
$desc = $jsonObject->{'desc'}; // Get desc from object

mysql_connect("localhost","root","");  // Conect to mysql, first parameter is location, second is mysql username and a third one is a mysql password
@mysql_select_db("findadeal") or die( "Unable to select database"); // Connect to database called test

$query = "INSERT INTO deal (dname, description) VALUES ('$name' ,'$desc')";
$result=mysql_query($query);
$num = mysql_numrows($result);

if($num != 0) {

    echo "true";

} else {

    echo "false"; 

}
?>

这一切都很好,但是,数据没有被插入数据库的原因是它需要用户的 ID,用户名存储在会话变量中。

我需要帮助的是:

1. 谁能告诉我如何从会话变量中获取数据并将其带到 PHP 文件中。 2. 此外,会话变量正在存储用户名 - 有没有办法我可以自行检查其相关的用户 ID 标记,或者这必须通过 PHP 中的 SQL 语句来完成文件。

我希望我没有引起任何混乱,并且我已经清楚自己遇到了什么问题。我是一名学生,因此在学习过程中将不胜感激所有帮助!我在思考会话数据应该像其他数据一样通过 javascript 函数还是应该能够直接读取到写入的 PHP 文件或什么? =/

感谢您的宝贵时间!

【问题讨论】:

  • 如果您已经有 HTML 输出,您将无法正确处理会话。确保在编写任何 HTML 行之前启动会话(在每个页面上)
  • 嗨@axel.michel,感谢您的回复。我没有正确处理会话吗?我在登录正在读取的 PHP 上有一个 session_start() 变量,然后我有会话 if 语句在所有其他正在呈现的页面上工作保持变量?到目前为止,它似乎一直在为我工作?还有什么我应该注意的吗?
  • 为什么不试试 cookie?
  • 饼干?我会让他们看看,看看我能找到什么!我希望我能正确解释自己,我想要做的是将会话 $_SESSION['username'] 带到将其他数据写入数据库的 PHP 文件中。这通常会有所帮助吗?

标签: php jquery mysql session


【解决方案1】:

如果我理解得很好,你现在更感兴趣的是学习东西而不是创建应用程序。我建议您尝试在单独的测试文件中一次学习一件事,当您获得必要的知识后,将所有知识结合到一个应用程序中,将您学到的所有内容应用于现实生活中的测试。

我是一名教练,培养了很多学生,帮助他们实现了一些他们可以引以为豪的产品,所以如果你有兴趣一一学习,我想我可以帮助你,如果你喜欢。

【讨论】:

  • 那你太好了,谢谢!一步一步地做每件事是我迄今为止的学习结构! (这也是为了让我不会去打破可能需要很长时间才能开始工作的东西:P)我只是在完成工作后将所有东西放在一起以查看练习的整体流程,这就是我的阶段在。我已经完成了用户注册,并且我将其用作几乎相同的概念(将数据写入数据库),但我想要找出的只是我如何将用户 ID 写入该表,因为它也存储在会话变量
  • 我想做的很多事情以及接下来要学习的内容确实都围绕着查看哪些用户已登录并呈现特定于他们的 ID 的数据等的想法——这就是学习如何工作的原因在本练习中使用变量将帮助我在稍后阶段将其操作给其他人!
【解决方案2】:

如果我的逻辑是正确的,你必须这样做:

在您的登录 HTML/PHP 页面上以:

<?php
    if( !isset( $_SESSION ) ){ session_start(); }
?>
THE REST OF YOUR CODE FOLLOWS HERE

在您的登录操作 PHP 脚本中,再次:

<?php
    if( !isset( $_SESSION ) ){ session_start(); }
    // now you look up your user - how ever you do this...
    // might be something like this...
    // this is not a real function it should just demonstrate
    // the possible logic.
    if(!isset($_SESSION['userid'])) {
        // you just have to check in case no session userid is set:
        function getUser( $username, $password ) {
            $db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS);
            $sql = 'SELECT id FROM users WHERE username=:username AND pwd=:pwd';
            $statement = $db->prepare($sql);
            $statement->bindParam(':username', $username, PDO::PARAM_STR);
            $statement->bindParam(':pwd', $password, PDO::PARAM_STR);
            $statement->execute();
            $result = $statement->fetch(PDO::FETCH_ASSOC);
            if(!empty($result)) {
                return $result['id'];
            }
            return false;
        }
        // call your login logic (here getUser) and 
        // if you have a result, set the session...
        $userExists = getUser($_POST['user'], $_POST['pwd']);
        if($userExists) {
            $_SESSION['userid'] = $userExists;
        }
    }
?>

在交易动作中,再次:

<?php
    if( !isset( $_SESSION ) ){ session_start(); }
    // you check if the username session exists
    if(isset($_SESSION['userid'])) {
        // in case you have...
        // proceed with your deal logic
        // and use $_SESSION['userid'] to fill it to the DB
    }
?>

【讨论】:

  • 嗨@axel.michel - 感谢您的回复。你的回答中有一个元素我想我可以使用。但是我可以问你吗,我的用户在登录表单中输入他们的用户名和密码并点击登录。在您给我的登录操作 PHP 脚本中,这是否只需要在数据库中归档“THE_USER_ID”并将其保存到会话中是吗?因为它会读取并保存它,而无需用户首先输入确切的字段?
  • @user2025934 我不确定你的问题是否正确。我已经更新了我的答案。我发布的不是一个工作脚本,它是一个基本的 HowTo。假设您有一个登录逻辑,用于测试用户是否存在并在成功时返回用户 ID。这是您保存在会话中的内容,然后您可以使用它,您可以在所有其他 PHP 文件中读取此值(只要您启动会话)。不再需要用户交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2015-04-17
  • 2015-11-08
  • 2016-04-17
  • 2011-08-27
  • 2013-10-19
  • 2012-06-21
相关资源
最近更新 更多