2017-10-05 102 views
1

我有兩個表在我的數據庫中,第一個表叫用戶它包含: ID,名,姓,電子郵件,密碼,散列,活動。插入數據從一個表到另一個表幾乎工作

第二個表稱爲上市,它包含: USER_ID,USER_EMAIL,listing_id,listing_title,list_description,上市_公司,listing_city,listing_image。

我想確保當用戶登錄到網站並創建新的列表時,該列表將被ID和電子郵件識別。

所以基本上我想從繁重的ID和電子郵件是在用戶表,並把它插入到USER_ID和USER_EMAIL列在上市表中的信息。

而我做到了,有點。

問題是,如果我登錄到網站並創建列表,數據庫將在列表表中顯示錯誤的user_id和user_email。 因此,例如:

如果我以[email protected]身份登錄,用戶ID爲1,我將創建一個新列表,當我轉到列表表格時,我可以看到user_id和user_email是不同的,它從最新的列拉在用戶桌上,而不是用戶是在實際登錄數據。

希望我自己清楚。

下面是代碼:

這是一個名爲「新掛牌的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"); 
} 



?> 

文件這是從頁面代碼的形式(「新上市.php'):

<?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

首先,您應該考慮使用預處理語句(查找mysqli::preparepdo),而不是嘗試清理和轉義輸入。

除此之外,在您的insert中,您使用的是$user_id_from_users_table$user_email_from_users_table來填充您的列表詳細信息。

基於您的代碼,您應該使用$_SESSION['id']$_SESSION['email']代替,但這些都需要消毒,或者你需要切換到預處理語句你放在一個INSERT

原始post數據之前,這是因爲$_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(); 
} 

話雖這麼說,我有點困惑,這是什麼是應該達到,或者你爲什麼想到這是任何形式的會話特定的數據?

+0

我用while循環來獲得排來自用戶表的信息,但是當我用不同的用戶登錄時,我仍然從用戶表中獲取最後一個條目 –

+0

您將會因爲您所做的只是將每行設置爲'id'和'email'直到它用完循環。除了循環遍歷'用戶'中的每一行,您在循環中沒有做任何事情。 –

+0

您認爲最好的解決方案是什麼? –

0

在您的代碼開始處,您正在從users表中選擇所有數據,然後在其中循環,因此您的最終結果是最後一個條目。

您需要消毒用戶輸入的電子郵件和用戶ID,然後使用WHERE參數在你的SELECT查詢只取WHERE ID = $ ID和電子郵件= $電子郵件

+0

我做了你的建議,但我仍然從用戶表中獲取最後一個條目 –

相關問題