2012-12-12 67 views
2

我想用輸入表單更新MySQL數據庫,本質上是一個用戶可以更新/更改其信息的設置頁面。使用下面的代碼,底部的echo會運行,但我沒有收到任何錯誤,但數據庫沒有更新。我在我的本地機器和服務器上都測試過它,但兩者都不起作用,儘管我不確定這與它有什麼關係。當用戶登錄時已經設置了$_SESSION['yourName'],所以它將等於數據庫中的當前值。我知道這裏有很多sql注入漏洞,但這只是一個概念驗證代碼,並沒有準備好上線。我試圖在phpMyAdmin中運行查詢,它工作正常。使用PHP更新MySQL

PHP

if(isset($_POST['name']) || isset($_POST['password']) || isset($_POST['location']) || isset($_POST['img'])) { 
//put this in an external file for a little extra security 
$username = "my_username"; 
$password = "my_password"; 
$database = "database_name"; 
$con = mysql_connect('localhost',$username,$password); 
if (!$con) { 
    die('Oh poop.... Could not connect: ' . mysql_error()); 
} 
//print item from database 
mysql_select_db($database, $con); 

if(isset($_POST['name'])) { 
    $query = 'UPDATE users SET username=' . $_POST['name'] . 'WHERE username=' . $_SESSION['yourName']; 
    mysql_query($query); 
    $_SESSION['yourName'] = $_POST['name']; 
} 
if(isset($_POST['password'])) { 
    $query = 'UPDATE users SET password=' . $_POST['password'] . 'WHERE username=' . $_SESSION['yourName']; 
    mysql_query($query); 
} 
if(isset($_POST['location'])) { 
    $query = 'UPDATE users SET location=' . $_POST['location'] . 'WHERE username=' . $_SESSION['yourName']; 
    mysql_query($query); 
    $_SESSION['location'] = $_POST['location']; 
} 
if(isset($_POST['img'])) { 
    $query = 'UPDATE users SET img=' . $_POST['img'] . 'WHERE username=' . $_SESSION['yourName']; 
    mysql_query($query); 
    $_SESSION['img'] = $_POST['img']; 
} 
echo '<script type="text/javascript">alert("changes saved")</script>'; 
} 

HTML

<form method="post"> 
    new name: <input type="text" name="name" /><br /> 
    new password: <input type="text" name="password" /><br /> 
    new location: <input type="text" name="location" /><br /> 
    new img: <input type="text" name="img" /><br /> 
    <input type='submit' name='save' value='save' /> 
    <input type='submit' name='logout' value='logout' /> 
</form> 
+0

'變種RQ =新的XMLHttpRequest(); rq.open('POST','update.php',false); rq.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); rq.send('password ='+ encodeURIComponent(「'password'; - 」));'是的,我可以登錄任何帳戶!請了解有關SQL注入防護的信息,並停止將未經轉義的用戶輸入直接放入您的查詢中。編寫的語句很好,特別是考慮到PHP 5.5棄用了'mysql_'擴展。 – Ryan

+0

...但是您看到的問題是因爲字符串周圍的引號丟失。 – Ryan

回答

7

嘗試使用雙引號,而不是單引號來修改你的PHP語句。

$query = "UPDATE users SET username='" . $_POST['name'] . "' WHERE username= '" . $_SESSION['yourName'] . "'"; 

,但上面的查詢與SQL Injection脆弱的,請閱讀下面的文章,

+0

這樣做,謝謝!正如在問題中所說的那樣,這只是一些測試代碼,並沒有任何準備就緒可以上線。但它總是很高興知道人們會指出SQL漏洞 – Hat

3

我建議使用PDO。 php mysql對象不贊成使用PDO或mysqli。

PDO:http://php.net/manual/en/book.pdo.php

你也將要更新主鍵列(ID或user_ID的)你行你的WHERE語句,或者你可以允許實現多個用戶行。

根據您的應用程序,我建議不要在您的數據庫中存儲密碼。存儲他們輸入密碼的鹽漬散列。

密碼哈希處理:http://php.net/manual/en/faq.passwords.php

if(isset($_POST['name']) || isset($_POST['password']) || isset($_POST['location']) || isset($_POST['img'])){ 
//put this in an external file for a little extra security 
$username = "my_username"; 
$password = "my_password"; 
$database = "database_name";         
try{ 
    $conn=new PDO('mysql:dbname='.$database.';host=localhost;port=3306',$username,$password); 
} 
catch(PDOException $ex){ 
    die('Could not connect: '.$ex->getMessage()); 
} 
$stm = $conn->prepare("UPDATE users SET username=?,password=?,location=?,img=? WHERE user_id=?"); 
$stm->execute(array($_POST['name'],$_POST['password'],$_POST['location'],$_POST['img'],$_SESSION['user_id'])); 
}