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

양식을 보내기 전에 자바 스크립트가있는 공백을 확인할 수 없습니까? – Peon

+0

정확히 작동하지 않는 것은 무엇입니까? 당신이 일하는 해결책을 제시 한 것처럼 보입니다. 아니면 그렇습니까? 언제 작동하지 않습니까? –

+0

@DainisAbols Javascript를 비활성화하거나 건너 뛸 수 있습니다. 요청이 curl과 같은 도구에서 나온 경우 스크립트를 실행하기위한 자바 스크립트 엔진이 없습니다. 서버 측의 유효성을 확인하기 위해서는 클라이언트 측 유효성 검사를 제출 된 데이터의 유효성을 보장 할 수있는 시스템이 아니라 유용성 지원으로 간주해야합니다. – GordonM

답변

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

Sugestion을 가져 주셔서 감사합니다.하지만 문제는 사용자가 필드 중 하나만 변경하고 모두 채울 수 없도록하려는 것입니다. – zorlac

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

이 잠수정 MySQL과 현장 사용에 빈 항목을 확인하는 작업 빈 값 대신에 이전 값. 이 작업을 수행하려면 값을 execute()으로 두 번 전달해야합니다. 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

+0

@ GordonM ... 그래서 같은 값을 두 번 통과 시켰습니다. 이름 붙여진 매개 변수는 각 쿼리에서 한 번만 사용할 수 있기 때문에 여전히 유용합니다. ('준비된 명령문에서 같은 이름의 명명 된 매개 변수 표식을 두 번 사용할 수 없습니다.'(http : // php. net/manual/ko/pdo.prepare.php) – DaveRandom

+0

좋아, 너 거기있어, 잊어 버렸어. – GordonM

관련 문제