我的数据库中有两个表,第一个表叫做用户,它包含: id,firstname,lastname,email,password,hash,active。
第二个名为列表的表格,它包含: user_id,user_email,listing_id,listing_title,list_description,listing _country,listing_city,listing_image。
我想确保当用户登录网站并创建新商家信息时,该商家信息将通过ID和电子邮件进行识别。
所以基本上我想从用户表中的id和电子邮件中获取信息,并将其插入列表表中的user_id和user_email列。
我做到了,有点儿。
问题是,如果我登录网站并创建列表,则数据库会在列表表中显示错误的user_id和user_email。 例如:
如果我以john@johndoe.com登录,用户ID为1,我将创建一个新的列表,当我转到列表时,我可以看到user_id和user_email是不同的,它从用户表中的最新行中提取数据,而不是实际登录的用户。
希望我明白自己。
以下是代码:
这是一个名为' new-listing-functions.php'
的文件<?php
error_reporting(E_ALL);
require 'db.php';
if(!isset($_SESSION)) {
session_start();
}
$result = $mysqli->query("SELECT * FROM users");
$query = "SELECT id, email FROM users";
if ($result = $mysqli->query($query)) {
/* Fetch associative array */
while ($row = $result->fetch_assoc()) {
$user_id_from_users_table = $row['id'];
$user_email_from_users_table = $row['email'];
}
$result->free();
}
$_SESSION['id'] = $_POST['user_id'];
$_SESSION['email'] = $_POST['user_email'];
$_SESSION['listing_title'] = $_POST['listing_title'];
$_SESSION['listing_description'] = $_POST['listing_description'];
$_SESSION['listing_country'] = $_POST['listing_country'];
$_SESSION['listing_city'] = $_POST['listing_city'];
$_SESSION['listing_image'] = $_POST['listing_image'];
$listing_title = $mysqli->escape_string($_POST['listing_title']);
$listing_description = $mysqli>escape_string($_POST['listing_description']);
$listing_country = $mysqli->escape_string($_POST['listing_country']);
$listing_city = $mysqli->escape_string($_POST['listing_city']);
$listing_image = $mysqli->escape_string($_POST['listing_image']);
$sql = "INSERT INTO listing (user_id, user_email, listing_title,
listing_description, listing_country, listing_city, listing_image)".
"VALUES('$user_id_from_users_table','$user_email_from_users_table',
'$listing_title', '$listing_description', '$listing_country',
'$listing_city', '$listing_image')";
if($mysqli->query($sql)) {
$_SESSION['message'] = "Thank you for creating a listing "
.$_SESSION['firstname'];
//header("location: home.php");
}
?>
这是带有表单的页面中的代码(&#39; new-listing.php&#39;):
<?php
require 'db.php';
session_start();
if(!$_SESSION['logged_in']) {
header("location: home.php");
}
require 'head.php';
?>
<?php
if($_SERVER['REQUREST_METHOD'] = 'POST') {
if(isset($_POST['post_listing'])) {
require 'new-listing-functions.php';
}
}
?>
<body id="new-listing">
<div class="new-listing-container">
<form action="#" method="post">
<input type="hidden" name="user_id">
<input type="hidden" name="user_email">
<input type="text" name="listing_title" placeholder="Listing Title">
<br>
<textarea name="listing_description" id="" cols="30" rows="20" placeholder="Listing Description"></textarea>
<input type="text" name="listing_country" placeholder="Country"><br>
<input type="text" name="listing_city" placeholder="City"><br>
<input type="file" name="listing_image""><br>
<button name="post_listing">Proceed</button>
</form>
</div><!-- new-listing-container -->
</body>
</html>
提前感谢您的帮助!
答案 0 :(得分:0)
首先,您应该考虑使用预准备语句(查找mysqli::prepare
或pdo
),而不是尝试清理和转义输入。
除此之外,在insert
您使用$user_id_from_users_table
和$user_email_from_users_table
填充您的商家详情。
根据您的代码,您应该使用$_SESSION['id']
和$_SESSION['email']
,尽管这些需要清理,或者您需要在将原始发布数据放入INSERT
之前切换到预准备语句
这是因为$_user_*_from_users_table
值看起来就像是用户表中最后获得的值:
$result = $mysqli->query("SELECT * FROM users");
$query = "SELECT id, email FROM users";
if ($result = $mysqli->query($query)) {
/* Fetch associative array */
while ($row = $result->fetch_assoc()) {
$user_id_from_users_table = $row['id'];
$user_email_from_users_table = $row['email'];
}
$result->free();
}
话虽如此,我对这应该实现的目标感到有点困惑,或者为什么你认为这是任何类型的会话特定数据?
答案 1 :(得分:0)
在代码开头,您正在从users表中选择所有数据,然后循环遍历它,因此您的最终结果是最后一个条目。
您需要清理用户输入的电子邮件和用户ID,然后在SELECT查询中使用WHERE参数来仅获取行WHERE id = $ id和email = $ email