2012-08-01 40 views
0

我正在嘗試爲我的網站和網站上的用戶配置文件創建更新頁面。下面的代碼工作正常,如果用戶更新他們所有的信息,但如果他們離開了一個字段,它會在表中插入一個空白記錄。從更新表單中更新空白或空字段來阻止sql

目前,如果用戶留下了一個空白字段,我們將替換空白字段爲$_SESSION['user']['field'],以便重新插入當前數據。

這是我此刻的PHP

<?php 
session_start(); 
if($_SESSION['uname']) { 
$logged_in=true; 
} else { 
$logged_in=false; 
} 
include_once("../connection/conn.php"); 

if(isset($_POST['update'])) { 

if($_POST['firstname']){ $firstname = $_POST['firstname']; } 
else { $firstname = $_SESSION['uname']['firstname']; } 

if($_POST['lastname']){ $lastname = $_POST['lastname']; } 
else { $lastname = $_SESSION['uname']['lastname']; } 

if($_POST['email']){ $email= $_POST['email']; } 
else { $email = $_SESSION['uname']['email']; } 

$id = $_SESSION['uname']['id']; 

$query = "UPDATE users SET firstname=?, lastname=?, email=? WHERE id=? "; 

$results = $condb->prepare($query); 

$results->execute(array($firstname, $lastname,$email,$id)); 

if($results) { 
echo "updated"; 
} 
} 

?> 
+0

你不能在發送表單之前用javascript檢查空格嗎? – Peon 2012-08-01 06:29:53

+0

那究竟是不是在工作?看起來你已經提出了一個可行的解決方案。還是呢?什麼時候不工作? – 2012-08-01 06:30:59

+0

@DainisAbols如果請求來自諸如curl之類的工具,那麼可以禁用或繞過Javascript,甚至不需要JavaScript引擎即可運行該腳本。您應該將客戶端驗證視爲可用性輔助,而不是作爲可以保證提交數據有效性的系統,因爲您必須驗證服務器端。 – GordonM 2012-08-01 07:41:48

回答

0

你必須給現場驗證

if($firstname!="" && $lastname!="" && $email!=""){ 

    $query = "UPDATE users SET firstname=?, lastname=?, email=? WHERE id=? "; 
    $results = $condb->prepare($query); 
    $results->execute(array($firstname, $lastname,$email,$id)); 
    if($results) { 
    echo "updated"; 
    } 
} 
else{ 
    echo "Fill all the fields!"; 
} 
+0

感謝您的消化,但問題是我希望用戶能夠更改只是其中一個領域,而不必填寫全部 – zorlac 2012-08-01 08:22:13

2
UPDATE `tablename` 
SET `field` = IF(? <> '', ?, `field`) 
WHERE ... 

該潛艇檢查空條目MySQL和字段使用的工作其先前的值而不是空值。您需要將該值傳遞到​​兩次才能使用。它的功能基本上與您正在做的一樣,但不必將值存儲在PHP會話中。

使用這種方法,你的更新代碼應該是這樣的:

/* 
    This block is no longer necessary 
if($_POST['firstname']){ $firstname = $_POST['firstname']; } 
else { $firstname = $_SESSION['uname']['firstname']; } 

if($_POST['lastname']){ $lastname = $_POST['lastname']; } 
else { $lastname = $_SESSION['uname']['lastname']; } 

if($_POST['email']){ $email= $_POST['email']; } 
else { $email = $_SESSION['uname']['email']; } 
*/ 

$query = " 
    UPDATE `users` 
    SET 
    `firstname` = IF(? <> '', ?, `firstname`), 
    `lastname` = IF(? <> '', ?, `lastname`), 
    `email` = IF(? <> '', ?, `email`) 
    WHERE `id` = ? 
"; 

$results = $condb->prepare($query); 

$results->execute(array(
    $_POST['firstname'], $_POST['firstname'], 
    $_POST['lastname'], $_POST['lastname'], 
    $_POST['email'], $_POST['email'], 
    $_SESSION['uname']['id'] 
)); 

您現有的代碼將停止從自身進入一個0,用戶此不會 - 你可能要爲此添加一個支票。

+0

+1對於這個想法,但是如果你使用了命名參數,你不必像你在做的那樣將參數加倍。 – GordonM 2012-08-01 07:39:15

+0

@GordonM ...這就是爲什麼我兩次傳遞相同的值。這仍然適用於命名參數,因爲在每個查詢中只能使用它們一次(令人討厭):[''不能在準備好的語句中使用兩次具有相同名稱的命名參數標記](http:// php。 net/manual/en/pdo.prepare.php) – DaveRandom 2012-08-01 07:40:24

+0

好的,你讓我在那裏,我忘了那個。 – GordonM 2012-08-01 07:42:27