2013-08-28 5 views
-1

양식을 통해 전달 된 데이터의 유효성을 검사 한 사용자 클래스를 만든 다음 데이터베이스 테이블 사용자를 업데이트합니다. 사용자 이름과 전자 메일이 테이블에 있는지 확인하는 등의 추가 기능을 추가하고 싶지만 약간의 스크립트를 추가했지만 작동하지 않는 것 같습니다. 데이터베이스에 사용자가 있는지 확인하십시오.

나는 중복 된 이메일 주소를 삽입 나는 오류 메시지를하지 않았다 "이메일이 존재"대신 내가 "1 행 삽입"성공 메시지를 얻을 :

내가 아래에 뭔가 잘못하고 오전? 아마도 이것에 접근하는 더 좋은 방법이 있을까요?

public function insert() { 

if (isset($_POST['submit'])) { 
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : ''; 

$result = $this->mysqli->prepare("SELECT * FROM users WHERE email='".$email."'"); 

if ($result->num_rows) { 
echo "email exisits!"; 
} 
else 
{ 
$stmt = $this->mysqli->prepare("INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, ?)"); 
     $stmt->bind_param('ssss', $username, $password, $name, $email); // bind strings to the paramater 
     //escape the POST data for added protection 

$username = isset($_POST['username']) ? $this->mysqli->real_escape_string($_POST['username']) : ''; 
$cryptedPassword = crypt($_POST['password']); 
$password = $this->mysqli->real_escape_string($cryptedPassword); 
    $name = isset($_POST['name']) ? $this->mysqli->real_escape_string($_POST['name']) : ''; 
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : ''; 
     /* execute prepared statement */ 
$stmt->execute(); 
    printf("%d Row inserted.\n", $stmt->affected_rows); 
    /* close statement and connection */ 
$stmt->close(); 
      } 
+0

될 것이다. –

+0

사용 /* execute query */ $ result-> execute(); /* 결과 저장 */ $ result-> store_result(); 그리고 나서 $ result-> num_rows()를 사용하십시오. –

+1

당신의 코드가 부 풀리거나 잘못되었습니다. –

답변

1

당신이 선택할 수있는 최악의 API를 사용하고 있습니다.

safeMysql으로는

$exists = $this->db->getOne("SELECT 1 FROM users WHERE email=?s", $_POST['email']); 
if ($exists) { 
    echo "email exisits!"; 
} 
이 약간 이상 PDO와

하지만

$stmt = $this->db->prepare("SELECT 1 FROM users WHERE email=?"); 
$stmt->execute(array($_POST['email'])); 
$exists = $stmt->fetchColumn(); 
if ($exists) 
{ 
    echo "email exisits!"; 
} 

사용할

될 것이라고하지만 원시 mysqli를 사용하면 사용자가있는 경우에만 확인하는 코드의 한 화면이 필요합니다.

그래서, safeMysql를 사용하여 전체 기능을 사용하면 효과적으로 동일한 이메일에 여러 사용자를 막을 수 email``에`UNIQUE` 인덱스를 추가 어쩌면 경우

public function insert() 
{ 
    if (!isset($_POST['submit'])) { 
     return FALSE; 
    } 

    $sql = "SELECT 1 FROM users WHERE email=?s"; 
    $exists = $this->db->getOne($sql, $_POST['email']); 
    if ($exists) 
    { 
     echo "email exisits!"; 
     return FALSE; 

    } 
    $sql  = "INSERT INTO users SET ?u"; 
    $allowed = array('username', 'name', 'email'); 
    $insert = $this->db->filterArray($_POST, $allowed); 
    $insert['password'] = crypt($_POST['password']); 
    $this->db->query($sql, $insert); 
    return $this->db->afectedRows(); 
} 
+0

PDO를 보게됩니다 감사합니다, 또한 준비 문이 좋은 연습이라고 생각? @YourCommonSense – 001221

+0

또는 MySQLi를 사용하고 있습니까? @ YourCommonSense – 001221

+0

준비된 문장은 좋은 연습이지만 잘못된 방법으로 사용하고 있습니다. –

1

당신 후에 당신이 아니에요 볼 수있는에서 대신

if ($result->num_rows) { 
echo "email exisits!"; 
} 
+0

덕분에 지금 시도해 보았습니다. 아래 작업을 수행하는 등 내 결과를 바인드해야합니까? – 001221

+0

num_rows –

+1

을 사용하려면 store_result()를 사용해야하고 $ stmt-> execute();를 사용해야합니다. 삽입 쿼리 후 문을 준비 –

-1

의이

if ($result->num_rows > 0) { 
echo "email exisits!"; 
} 

를 넣어 문장을

$stmt->execute(); 
$stmt->store_result(); 

을 준비하는이 코드를 사용할 필요가 testin 전에 num_rows에 값 지정하기 항상 0

0

우선 될 경우 ($에서 그 결과> NUM_ROWS), 그래서와 g를 사용중인 prepare (! 좋은)하지만 당신은 효과적으로 준비의 이익을 물리 치고, 이메일의 가치를 전달하는 진술.

두 번째로 쿼리를 실행하지 않으므로 num_rows에 아무것도 표시되지 않습니다.

public function insert() { 

$result = $this->mysqli->prepare("SELECT COUNT(*) FROM users WHERE email=?"); 
$result->bind_param("s", $_POST['email']); 
$result->execute(); 
$result->bind_result($email_count); 

if ($email_count) { 
    echo "email exisits!"; 
} else { 
    # your other logic 
+0

isset 사용에 대한 당신의 생각은 꽤 틀리다. –

+0

나는 이것을 구현 하나 다음과 같은 에러가 발생한다 :'Warning : mysqli_stmt :: bind_param() : 변수의 수가 E : \ xampp \ htdocs에있는 prepared statement의 매개 변수의 개수와 일치하지 않는다. \ imanage \ insert.php 52' '치명적인 오류 : E : \ xampp \ htdocs \ imanage \ insert.php에있는 객체가 아닌 객체의 bind_param() 함수를 호출하십시오. 이메일 하나의 변수는 오류 메시지, 어떤 제안을 이해하지 못합니까? @ BurhanKhalid – 001221

+0

아니, 그의 생각은 적절한 하나입니다 –

관련 문제