2012-08-01 62 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