2010-08-15 5 views
0

PHP 프로그래밍 기술을 향상시키려는 사람이 누구든지이 코드를 기반으로 팁이나 방향을 제시 할 수 있습니까?내 코드를 더 효율적이고 효율적으로 만들 수있는 방법은 무엇입니까?

<?php 

include("db.php"); 
include("function.php"); 

//variables 
$number = htmlspecialchars($_POST['num']); 
$date = date("Y-m-d"); 

//validate phone number 
if (strlen($_POST['num']) != 12){ 
print "Invalid Phone Number."; 
die(); 
} 

//check how many times the number was called today 

    $callstoday = mysql_query(" 
    SELECT number 
    FROM numbers 
    WHERE number = '$number' 
    AND date 
    LIKE '$date%'") 
    or die(mysql_error()); 
    $callstotal = mysql_num_rows($callstoday); 



//cant do more than 5 calls 

if ($callstotal < 5){ 
    //do nothing 
}else{ 
    print "Not Allowed"; 
die(); 
} 





//break up the number in 3 parts 
$bits = explode("-", $number); 
$data = get_carrier("http://site.com/?action=carrierlookup&p1=".$bits[0]."&p2=".$bits[1]."&p3=".$bites[2]."&iecache=0"); 


//check when they want to call 

if ($_POST['when'] == 'now'){ 
$when = "0"; 
}elseif($_POST['when'] == 'secs'){ 
$when = "30"; 
}elseif($_POST['when'] == 'minute'){ 
$when = "60"; 
}elseif($_POST['when'] == '2minute'){ 
$when = "120"; 
}elseif($_POST['when'] == '5minute'){ 
$when = "300"; 
} 

//check for carrier 
if(strstr($data, 'Cingular')){ 
$carrier = "AT&T"; 
}elseif(strstr($data, 'Sprint')){ 
$carrier = "Sprint"; 
}elseif(strstr($data, 'Verzion')){ 
$carrier = "Verzion"; 
}elseif(strstr($data, 'T-Mobile')){ 
$carrier = "T-Mobile"; 
}elseif(strstr($data, 'Boost')){ 
$carrier = "Boost Mobile"; 
}elseif(strstr($data, 'Cricket')){ 
$carrier = "Cricket"; 
}elseif(strstr($data, 'Alltel')){ 
$carrier = "Alltel"; 
}elseif(strstr($data, 'Unable')){ 
$carrier = "Unknown Carrier"; 
} 




//inset number and carrier into database. 
mysql_query("INSERT INTO numbers (number, carrier) 
VALUES ('$number', '$carrier')"); 
print "success"; 
mysql_close($con); 


//call out to the number 
$strippednumber = str_replace("-", "", $number); 
$call = call("http://domain.com"); 


?> 

답변

2
$number = htmlspecialchars($_POST['num']); 

하지 가능한 SQL 주입을 방지 할 수 있습니다.

$number = mysql_real_escape_string($number); 

$_POST["when"] 체크는 어레이 검사에서 더 좋을 것입니다.

$whens = array("now" => "0", "secs" => "30".....); 
if (array_key_exists($_POST['when'], $whens)) 
$when = $whens[$_POST['when']]; 

같은 캐리어 체크 간다 :

$carriers = array("Cingular" => "AT&T", "Sprint" => "Sprint" .....); 

foreach ($carriers as $key => $value) 
    if (strstr($data, $key)) 
    { 
     $carrier = $value; 
     break; 
    } 

당신은 POST 변수 중 하나가 설정되지 않은 경우에 대한 검사를 추가 할 수 있습니다.

+0

htmlspecialchars가 주사를 막지 않습니다. –

+0

주사 방지를 위해 mysql_real_escape_string을 사용해야합니다. – Androme

+0

그리고 나는 switch 문에서 더 나은 것을 본다. 일반 및 직접 if 문보다 읽기 쉽습니다. 아래와 같은 배열 접근법이 가장 좋을지라도. –

0

먼저 여기에 몇 가지 팁이 있습니다.

  1. 변수가없는 문자열의 경우 '대신'을 사용하십시오. 'PHP는 문자열의 변수를 찾습니다.'옵션을 사용하면 붙여 넣기 만 할 것입니다. 이것은 당신에게 약간의 CPU 시간을 절약 할 것입니다.
  2. mysql으로 작업 할 때, 결과를 세고 싶다면 간단한 카운트 (0)를 수행하는 것이 훨씬 빠르며 모든 행을 가져 와서 계산하십시오.
  3. mysql_real_escape_string을 사용하여 SQL 문자열에 변수를 붙여 넣는 것을 잊지 마십시오. 조건 중 하나가 아무것도 할 수없는 경우 당신은 PHP 태그를 종료 할 이유가없는 유일한 PHP 코드가 포함 된 파일이있을 때 ..
  4. 그것을 알아두면
  5. 당신이 때이 "?>"난 것입니다 만 원인 그 신 댐을 찾는 문제 새로운 라인 오그 공간은 어디에서 왔는지.

코드에서 최적화 할 수있는 부분은 많지 않습니다. 대부분 읽기 쉽습니다. 스크립트 임시 수정, 고정 된 사출 문제 및 업데이트 된 약간의 가독성을 업데이트했습니다.

정말로 새로운 차원의 PHP 프로그래밍을 원한다면 먼저 클래스를 살펴보고 MVC를 사용해보십시오. Zend Framework를 추천 할 수 있습니다.

<?php 
include("db.php"); 
include("function.php"); 

//variables 
$number = htmlspecialchars($_POST['num']); 
$date = date("Y-m-d"); 

//validate phone number 
if (strlen($_POST['num']) != 12){ 
print "Invalid Phone Number."; 
die(); 
} 

//check how many times the number was called today 

$callstoday = mysql_query(' 
    SELECT count(0) as `count` 
    FROM numbers 
    WHERE number = '.mysql_real_escape_string($number).' 
    AND date 
    LIKE \''.mysql_real_escape_string($date).'%\'') 
or die(mysql_error()); 
$callstoday = $callstoday[0]['count']; 


//cant do more than 5 calls 
if ($callstotal >= 5){ 
    print "Not Allowed"; 
    die(); 
} 

//break up the number in 3 parts 
$bits = explode('-', $number); 
$data = get_carrier('http://site.com/?action=carrierlookup&p1='.$bits[0].'&p2='.$bits[1].'&p3='.$bites[2].'&iecache=0'); 


//check when they want to call 
switch($_POST['when']) 
{ 
    case 'now': 
     $when = 0; 
     break; 
    case 'secs': 
     $when = 30; 
     break; 
    case 'minute': 
     $when = 60; 
     break; 
    case '2minute': 
     $when = 120; 
     break; 
    case '5minute': 
     $when = 300; 
     break; 
} 
//check for carrier 
if(strstr($data, 'Cingular')) 
    $carrier = "AT&T"; 
elseif(strstr($data, 'Sprint')) 
    $carrier = "Sprint"; 
elseif(strstr($data, 'Verzion')) 
    $carrier = "Verzion"; 
elseif(strstr($data, 'T-Mobile')) 
    $carrier = "T-Mobile"; 
elseif(strstr($data, 'Boost')) 
    $carrier = "Boost Mobile"; 
elseif(strstr($data, 'Cricket')) 
    $carrier = "Cricket"; 
elseif(strstr($data, 'Alltel')) 
    $carrier = "Alltel"; 
elseif(strstr($data, 'Unable')) 
    $carrier = "Unknown Carrier"; 



//inset number and carrier into database. 
mysql_query("INSERT INTO numbers (number, carrier) 
VALUES (\''.mysql_real_escape_string($number).'\', \''.mysql_real_escape_string($carrier).'\')"); 
print "success"; 
mysql_close($con); 


//call out to the number 
$strippednumber = str_replace("-", "", $number); 
$call = call("http://domain.com"); 
+0

* this *를 upvoted who는 코드를 읽는 것을 괴롭히지 않았다. 어리 석고 오해의 소지가있는 "충고"는 말할 것도 없습니다. –

+0

어떻게 그걸 알아? – Androme

+0

$ date를 mysql_real_escape_string으로 둘러 쌀 필요가 없습니다. –

0

세 더 일 :

    버라이존은 그렇게 철자가
  • 하지 Verzion ;-)
  • 당신의 날짜 열이 DATETIME 인 경우 귀하의 SQL이보다 효율적으로 date>=CUR_DATE() AND date<DATE_ADD(CUR_DATE(), INTERVAL 1 DAY)로 기록 될 수 있습니다
  • - 쿼리 최적화 프로그램이 이러한 종류의 패턴을 인식하지 않는 한, 데이터베이스를 각 날짜를 문자열로 변환해야 할 수도 있습니다.
  • 당신은 더 나은 그냥 12 자, 이것은 또한 SQL 주입 공격으로부터 보호됩니다 부작용을 -as 있다고 확인하는 것이 아니라, 적절한 정규식에 대해 $의 납입을 확인할 수 :
if (!preg_match("/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/", $num)) { 
    // Invalid number - fail 
} 
-1

변수가있을 때 $를 사용하지 않습니다. 하지만 당신은 HTML 형태로 이미 설정해야 것 같습니다 :

<option value ="0">now</option> 
<option value ="30">secs</option> 
... 

은 (이미 $ _POST [ ""]

+0

lol. Doomstone이 복수를 얻었습니다 :) –

+0

그는 스크립트에서 확실한 유효성을 확인하기 위해 여전히 ned 했으므로 결국에는 '초'대신 '30'으로 끝납니다. Totaly 덜 – Androme

+0

유효성 검사 지점이며, 훨씬 간단하게 할 수 있습니다. –

1
include("db.php"); 
include("function.php"); 

더 나은 사용 require_once를 당신에게 원하는 번호를 줄 것이다 '파일').

$number = htmlspecialchars($_POST['num']); 

나는 놀람을 방지하기 위해 (int)$_POST['num']을 사용합니다.

if ($callstotal < 5){ 
    //do nothing 
}else{ 
    print "Not Allowed"; 
die(); 
} 

"// 아무 것도하지 않는"것이 가장 좋은 방법은 아닙니다. 이처럼 수행

if ($callstotal >= 5){ 
    print "Not Allowed"; 
    die(); 
} 

는 또한 나는이 일에 대해 동의

$carriers = array("Cingular" => "AT&T", "Sprint" => "Sprint" .....); 

모든 최고! :)

관련 문제