如何使用PHP Cookie识别未注册的在线购物者?
我习惯于在用户登录时使用php会话。我试图通过创建一个随机的如何使用PHP Cookie识别未注册的在线购物者?,php,session,cookies,Php,Session,Cookies,我习惯于在用户登录时使用php会话。我试图通过创建一个随机的用户id并将其存储在购物车中,来找出如何识别访客(未注册用户)的购物车,但我不理解cookies的逻辑。我正在生成一个cookie\u值,一个带有rand()的随机数。我是否需要像使用session.php一样将cookie.php添加到每个页面 cookie.php <?php $cookie_value =rand(10,100); $cookie_name='new_user'.$cookie_value; setcooki
用户id
并将其存储在购物车中,来找出如何识别访客(未注册用户)的购物车,但我不理解cookies的逻辑。我正在生成一个cookie\u值,一个带有rand()
的随机数。我是否需要像使用session.php
一样将cookie.php
添加到每个页面
cookie.php
<?php
$cookie_value =rand(10,100);
$cookie_name='new_user'.$cookie_value;
setcookie($cookie_name,$cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
$user_id=$cookie_value;
if(!isset($_SESSION['login_user'])){
include 'includes/cookie.php';
}elseif(isset($_SESSION['login_user'])){
include 'includes/session.php';
}
if(!empty($_POST)){
if(isset($_POST['addCart'])){
//insert product
$product_id = $_POST['product_id'];
$user_id = $_POST['user_id'];
$quantity=$_POST['quantity'];
$product_price=$_POST['product_price'];
// prepare and bind
$cart = $db->prepare("INSERT INTO shopping_cart
(user_id,product_id,quantity,amount) VALUES (?,?,?,?)");
$cart->bind_param("iiis", $user_id,$product_id,$quantity,$product_price);
$cart->execute();
if($cart){
header('Location: cart.php');
exit;
}
$cart->close();
$db->close();
} }
如果您需要在每个页面上包含cookies.php,请回答您的问题。您的cookie设置将导致麻烦,或者至少如果您使用多个cookie(甚至可能是您不知道的cookie)。如果您的cookie名称是随机的,您将如何轻松地检索它 您不应该连接随机值以形成cookie名称。因此,应将行更改为:
$cookie_value =rand(10,100); // sure about only 90 users??
$cookie_name='tmp_user_id'; // maybe temporary user is a more appropriate naming
if(!isset($_COOKIE['tmp_user_id']) && !isset($_SESSION['login_user'])) {
setcookie($cookie_name,$cookie_value, time() + (86400 * 30), "/");
}
这样,您就可以在脚本中检索它,如下所示:
if(isset($_COOKIE['tmp_user_id'])) {
$user_id = $_COOKIE['tmp_user_id'];
}
编辑
正如塞巴斯蒂安在评论中指出的那样,显然,您应该检查cookie是否已设置。因此,如果未设置cookie和用户会话,请设置cookie。如果您的会话设置过程应该驻留在session.php中,请在其后包含cookie.php。要回答您的问题,如果您需要在每个页面上包含cookies.php,请选择“是”。您的cookie设置将导致麻烦,或者至少如果您使用多个cookie(甚至可能是您不知道的cookie)。如果您的cookie名称是随机的,您将如何轻松地检索它 您不应该连接随机值以形成cookie名称。因此,应将行更改为:
$cookie_value =rand(10,100); // sure about only 90 users??
$cookie_name='tmp_user_id'; // maybe temporary user is a more appropriate naming
if(!isset($_COOKIE['tmp_user_id']) && !isset($_SESSION['login_user'])) {
setcookie($cookie_name,$cookie_value, time() + (86400 * 30), "/");
}
这样,您就可以在脚本中检索它,如下所示:
if(isset($_COOKIE['tmp_user_id'])) {
$user_id = $_COOKIE['tmp_user_id'];
}
编辑
正如塞巴斯蒂安在评论中指出的那样,显然,您应该检查cookie是否已设置。因此,如果未设置cookie和用户会话,请设置cookie。如果您的会话设置过程应该驻留在session.php中,请在其后包含cookie.php。您将事情复杂化了很多。PHP会话已经完成了您想要的任务。事实上,它们是专门用来解决这个问题的 默认情况下,PHP会话使用Cookie来维护请求之间的状态,并为每个用户分配一个唯一的会话ID,您可以从脚本中读取该ID。因此,您无需设置额外的cookie。您的代码可以简单到:
if(isset($_SESSION['logged_user'])) $user_id = $_SESSION['logged_user'];
else $user_id = session_id();// id sticks because it was stored in a cookie by PHP
现在,您可以使用此$user\u id
存储或检索数据库中的购物车数据。事实上,如果您正在与一个尚未登录的用户打交道,您甚至可以将购物车数据存储在$\u SESSION
中,这样您就不会用非成员数据阻塞数据库
查看文档:你把事情复杂化了很多。PHP会话已经完成了您想要的任务。事实上,它们是专门用来解决这个问题的 默认情况下,PHP会话使用Cookie来维护请求之间的状态,并为每个用户分配一个唯一的会话ID,您可以从脚本中读取该ID。因此,您无需设置额外的cookie。您的代码可以简单到:
if(isset($_SESSION['logged_user'])) $user_id = $_SESSION['logged_user'];
else $user_id = session_id();// id sticks because it was stored in a cookie by PHP
现在,您可以使用此$user\u id
存储或检索数据库中的购物车数据。事实上,如果您正在与一个尚未登录的用户打交道,您甚至可以将购物车数据存储在$\u SESSION
中,这样您就不会用非成员数据阻塞数据库
请参阅文档:在您的用户id列中,您是否同时存储登录的用户id和从cookie中随机生成的id以识别和检索购物车?@Yolo:不,我没有。我只想显示一个访客购物车。在您的“用户id”列中,您是否同时存储登录的用户id和从Cookie中随机生成的id以识别和检索购物车?@Yolo:不,我没有。我只想显示一个访客购物车。通过在每个页面上包含cookie.php,它不是每次都会创建一个新的随机数吗?在cart.php上,我使用此查询获取访客购物车:选择*FROM shopping\u cart,其中user\u id=“$user\u id”,但问题是cookie是随机的。。。号码变了,我无法取回购物车。但是如果我想识别哪个购物车属于哪个访客,我不能为每个访客设置相同的cookie。“这有意义吗?”塞巴斯蒂安法姆感谢你指出这一点。我修改了我的答案。通过在每个页面上包含cookie.php,它不是每次都会创建一个新的随机数吗?在cart.php上,我使用此查询获取访客购物车:选择*FROM shopping_cart,其中user_id=“$user_id”,但问题是cookie是随机的。。。号码变了,我无法取回购物车。但是如果我想识别哪个购物车属于哪个访客,我不能为每个访客设置相同的cookie。“这有意义吗?”塞巴斯蒂安法姆感谢你指出这一点。我修改了我的答案。