2012-10-10 2 views
0

아래 코드는 양식 데이터를 제출할 때 사용하는 코드입니다. 양식은 문제없이 잘 진행되고 리디렉션됩니다.SQL이 실제 값 대신 0을 제출합니다. 또한 @ 및. 이메일 주소

데이터베이스 내의 행 데이터를 보면 companyname, firstname 및 lastname이 0으로 삽입 된 것을 알 수 있습니다. 전자 메일 주소가 데이터베이스에 삽입되는 동안 @ 및을 (를) 삭제하는 것으로 나타났습니다. 주소에서.

어떤 도움

주시면 감사하겠습니다.

<?php 
include("inc/conf.inc.php"); // Includes the db and form info. 
if (!isset($_POST['submit'])) { // If the form has not been submitted. 

} else { // The form has been submitted. 
    $companyname = form($_POST['companyname']); 
    $firstname = form($_POST['firstname']); 
    $lastname = form($_POST['lastname']); 
    $username = form($_POST['emailaddress']); 
    $password1 = md5($_POST['password1']); // Encrypts the password. 
    $password2 = md5($_POST['password2']); 

    if (($companyname == "") || ($firstname == "") || ($lastname == "") || ($username == "") || ($password1 == "") || ($password2 == "")) { // Checks for blanks. 
     exit("There was a field missing, please correct the form."); 
    } 

    $q = mysql_query("SELECT * FROM `users` WHERE emailaddress = '$username'") or die (mysql_error()); // mySQL Query 
    $r = mysql_num_rows($q); // Checks to see if anything is in the db. 

    if ($r > 0) { // If there are users with the same username/email. 
     exit("That email address is already in use!"); 
    } else { 
     mysql_query("INSERT INTO `users` (companyname,firstname,lastname,emailaddress,password) VALUES ('$companyname','$firstname','$lastname','$username','$password1')") or die (mysql_error()); // Inserts the user. 
    header("Location: thankyou.php"); // Back to login. 
    } 
} 
mysql_close($db_connect); // Closes the connection. 
?> 




    <?php 
$db_user = ""; // Username 
$db_pass = ""; // Password 
$db_database = ""; // Database Name 
$db_host = "localhost"; // Server Hostname 
$db_connect = mysql_connect ($db_host, $db_user, $db_pass); // Connects to the database. 
$db_select = mysql_select_db ($db_database); // Selects the database. 

function form($data) { // Prevents SQL Injection 
    global $db_connect; 
    $data = preg_replace('/[^A-Za-z0-9_]/', '', $data); 
    $data = mysql_real_escape_string(trim($data), $db_connect); 
    return stripslashes($data); 
} 
?> 
+0

무엇처럼'form' 보이는 기능을합니까? – jeroen

+1

'form()'함수는 문자열을 정수로 캐스팅하는 것과 같이 이상한 작업을 수행합니다. (숫자가 아닌 문자열의 경우 0이됩니다) –

+1

SQL 주입에 대한 잠재적 가능성을 볼 수 있습니다. http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php를보십시오 – doublesharp

답변

0

어떤 도움 그래서이 죄송하지만를 :) 나를 시작하자

을 감상 할 수있다 코드는 매우 조직적이다

파일 : ...

가의 새 설정 (또는 LIB)이 파일은 다음과 유사한 것이라고 가정하자 config.php

<?php 

/** 
* 
* @param string $host Mysql host 
* @param string $user Mysql username 
* @param string $passw Mysql password 
* @param string $db Mysql database to work with 
* @return TRUE if could connect and select given database 
*/ 
function connect($host ='ur host', $user='ur username', $passw='ur passw', $db='ur dbname'){ 
    if (!mysql_pconnect($host, $user, $passw)){ 
    die("Can't connect to SQL server"); 
    } 

    if (mysql_select_db($db)){ 
    die("Can't select database"); 
    } 

return true; 
} 

/** 
* Determine whether user has been registered before 
* @param string $email 
* @return boolean 
*/ 
function userAlreadyExists($username){ 
    if (connect()) { //ensure we are connected 
     #Prevent injection right here: 
     $username = mysql_real_escape_string($username); 

     $result = mysql_query("SELECT * FROM `users` WHERE emailaddress = '$username' LIMIT 1"); 

     if (mysql_num_rows($result) > 0){ 
     # True means that user exists 
     return true; 
     } else { 
     #False means that user do not exists: 
     return false; 
     } 
    } 

    /** 
    * 
    * @return boolean 
    * TRUE if could insert new row 
    * FALSE if this row already exists or error in sql server 
    */ 
    function addNewUser($companyname, $firstname, $lastname, $username, $password1){ 

    $companyname = mysql_real_escape_string($companyname); 
    $firstname = mysql_real_escape_string($firstname); 
    $lastname = mysql_real_escape_string($lastname); 
    $username = mysql_real_escape_string($username); 
    $password1 = md5($password1); 

    if (connect()){ 
     return mysql_query("INSERT INTO `users` (`companyname`,`firstname`,`lastname`,`emailaddress`,`password`) VALUES ('$companyname','$firstname','$lastname','$username','$password1')"); 

    } 

    } 

    /** 
    * Function that compare password that makes sure 
    * if they're the same 
    */ 
    function pass_compare($pass1, $pass2){ 

    if ($pass1 !== $pass2){ 
     die("Passwords are not the same"); 
    } 
    return true; 
    } 

이 당신을 위해 작동합니다 handler.php

<?php 

if (!empty($_POST)){ //This code runs when form has been submitted 

//Maybe we should check if some value is missing, before we connect SQL //server!? 

    #Check if some field is missing: 
    foreach ($_POST as $key => $val){ 

    if (empty($key)){ 
     sprintf('The field %s is missing', $key); 
     die(); 
    } 
    } 

    #connect mysql server 
    connect(); 

    if (userAlreadyExists($_POST['email'])){ 

    die(printf('The <b>%s</b> is already in use', $_POST['email'])); 

    } else { 

    if (pass_compare($_POST['password'], $_POST['password_confirm'])){ 

    addNewUser($_POST['companyname'], $_POST['firstname'], $_POST['lastname'], $_POST['username'], $_POST['password']); 
    } 
    } 


} 

파일

+0

그냥 내 DB를보고 깨달았다 .... 그 열은 INT로 설정되었고 VARCHAR로 설정되지 않았다. –

+0

INT 문제. 제출시 해당 열이 올바르게 채워집니다. –

1

눈치 채면 언급 한 입력란은 기능 양식()에 의해 처리됩니다. form() 함수의 반환 값을 확인하기 위해 출력 할 수 있습니다.

또한

대신 체크,

($companyname == "") 

사용 :

empty($companyname) 

그냥 빈 문자열보다 더 많은 것을 확인합니다.

다음 사항

는 비어있는 것으로 간주된다

(정수로서 0) ","(빈 문자열)

0 (float로서 0)

0.0

(문자열로 0)

"0"

NULL

FALSE

배열() (하늘의 배열)

$ var에; (변수가 아니라 값없이 선언)

+0

내 conf.inc.php 코드를 게시 할 것이다. –