2010-05-06 39 views
0

這可能很容易爲你們,但我不明白。 我想將圖像的文件名保存到它自己的SQL基本行中。jQuery - 保存到SQL通過PHP

基本上,我登錄到我有我自己的用戶ID的網站。 並且每個用戶都有自己的背景圖像列。如果用戶願意,用戶可以選擇他自己的圖像。所以基本上,當用戶點擊他想要的圖像時,發生了一個jquery點擊事件,並且ajax調用了一個php文件,該文件應該處理實際更新。每個用戶的行總是存在,所以只需要更新數據。

首先,我收集css屬性'background-image'的文件名並將其分開,以便只獲取文件名。我則該文件名存儲在一個變量我稱之爲「文件名」,然後將其傳遞給這個jQuery的片段:

$.ajax({ 
     url: 'save_to_db.php', 
     data: filename, 
     dataType:'Text', 
     type: 'POST', 
     success: function(data) { 
      // Just for testing purposes. 
      alert('Background changed to: ' + data); 
    } 

    }); 

這是保存數據的PHP:

<?php 
require("dbconnect.php"); 

$uploadstring = $_POST['filename']; 

mysql_query("UPDATE brukere SET brukerBakgrunn = '$uploadstring' WHERE brukerID=" .$_SESSION['id']); 
mysql_close(); 
?> 

基本上,每個用戶都有自己的ID,這被稱爲「brukerID」 表一切都在被稱爲「brukere」和我應該更新的列是一個叫做「brukerBakgrunn」

當我剛剛運行的JavaScript代碼段,我得到這個消息框作爲回報重新它說:

背景改爲:
警告:在session_start()[function.session啓動]: 無法發送會話緩存限制器 - 頭已經發出(輸出在 /VAR開始 /www/clients/client2/web8/web/save_to_db.php:1) 在 /var/www/clients/client2/web8/web/access.php 上線

這是dbconnect.php

<?php 
$con = mysql_connect("*****","******","******"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("****", $con); 
require("access.php"); 
?> 

這是access.php:

<?php 
// Don't mess with ;) 
session_start(); 

if($_REQUEST['inside']) session_destroy(); 

session_register("inside"); 
session_register("navn"); 
if($_SESSION['inside'] == ""){ 
    if($_POST['brukernavn'] and $_POST['passord']){ 
    $query = "select * from brukere where brukerNavn='" . $_POST['brukernavn'] . "' and brukerPassord = md5('" . $_POST['passord'] ."')"; 
    $result = mysql_query($query);  
    if(!$result) mysql_error(); 
    $rows = @mysql_num_rows($result); 
     if($rows > 0){ 
    $_SESSION['inside'] = 1; 
    $_SESSION['navn'] = mysql_result($result,"navn"); 
    $_SESSION['id'] = mysql_result($result,"id"); 
    Header("Location: /"); 
    } else { 
    $_SESSION['inside'] = 0; 
    $denycontent = 1; 
    } 
    } else { 
    $denycontent = 1; 
    } 
} 

if($denycontent == 1){ 
include ("head.php"); 
print(' 
<body class="bodylogin"> 
    content content content  
</body> 
'); 
include ("foot.php"); 
exit; 
} 
?> 

回答

2
mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id'] .""; 

應該

mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id']); 

右括號丟失和引號( 「」)是無用的。

閱讀關於SQL injection爲了讓您的應用安全。

編輯:(?之間的部分>和< PHP)

<?php 
require("dbconnect.php") 
?> 

<?php 

此代碼發送一個換行符到輸出(這是一樣的回聲「\ n」),這是不允許的,如果你想因此寫入會話變量。

+0

+1,我編輯修復你的錯字,並想評論注射。但你已經把注入thingie和意外地恢復了我的更正;-) – 2010-05-06 11:40:27

+0

太快的協作:-) – 2010-05-06 11:42:49

+0

好吧,我更新了第一篇文章。我從ajax方法得到不同的消息。這是關於主機它不能發送會話緩存限制器,頭已經發送。 而數據也沒有更新。如果我從php文件中刪除'require(「dbconnect.php」),那麼我從ajax獲得的所有回報都是無關緊要的。所以它看起來像是需要的。 – 2010-05-06 11:52:37

0

你在你的mysql_query行中忘記了關閉')'!

mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id']); 

您在查詢結束時也不需要「。」。

2

重大安全問題!

您沒有引用和轉義輸入到MySQL查詢。我可以輕鬆地破解結尾,堆棧另一個查詢,並刪除整個數據庫!

此外,您在mysql_query()末尾缺少結尾圓括號。

+0

你將如何將你的查詢放在他的Session變量ID中?這可能會被檢查和玷污。 – Konerak 2010-05-06 11:39:44

+1

爲什麼會話? uploadstring來自發布數據。 – 2010-05-06 11:42:12

+0

那麼?即使'$ uploadString'沒有被引用+轉義;我可以輕易地破解那一個。 – 2010-05-06 11:42:29

1

刪除空行的session_start()之前:

?> 

<?php 
+0

不執行任何操作,因爲session_start()之前沒有空行。 編輯:對不起,我明白你的意思:)修正了一個。 – 2010-05-06 12:07:37

0
require("dbconnect.php") 

應該

require("dbconnect.php"); 
+0

如果我這樣做,則會再次顯示有關'無法發送會話緩存限制器'的錯誤消息。 – 2010-05-06 12:30:17

1

原來的錯誤是由於在需要對線路缺少分號。

正如其他人所說,你需要了解sql注入和使用佔位符。避免使用提交的數據而不使用佔位符或首先轉義的習慣。

+0

我甚至沒有習慣!我只是在摸索周圍,努力學習所有這些。 – 2010-05-06 12:41:06

1
<?php 
//require_once("dbconnect.php"); 

$uploadstring = $_REQUEST['filename']; 

$db_pswd = 'xxx-xxx-xxx'; 
$db_user = 'john_doe'; 
$db_table = 'my_table'; 

$con = mysql_connect('localhost' , $user , $pswd); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db($db_table , $con); 

mysql_query(" UPDATE brukere SET brukerBakgrunn = '".$uploadstring."' 
WHERE brukerID = '".$_SESSION['id']."' "); 

mysql_close($con); 
?> 

我認爲你需要使用新鮮的代碼!你的感覺妥協了! ;-))

+0

嗯,我想我需要的是瞭解這一切如何工作。我的意思是,在登錄到網站之前,代碼的第一部分基本上就是我所做的。然後,在我登錄後,連接是否仍然打開?我需要再次提供連接屬性嗎? – 2010-05-09 15:33:59