2012-12-25 5 views
0
내부 작동

내 문제는 내가 작동 전역 범위에서 MySQL을 사용하지만, 그렇지 않은 내부하시기 바랍니다 코드를 살펴있을 때이다 :PHP는 mysql_query가 작동하지

//connect.php 
@mysql_connect($mysql_server, $mysql_admin, $mysql_pass); 
@mysql_select_db($mysql_db); 

//main.php 
require_once("connect.php"); 
$rReq = $_REQUEST["req"]; 

function failed() 
{ 
     $qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'"); 
     $ro = mysql_fetch_row($qe); 
     $ro[0]+=1; 
     mysql_query("UPDATE db SET success_count = '".$ro[0]."' WHERE serial='".$rReq."'"); 
} 

//main code 
failed(); // not works, mysql_query does nothing 

//if i put here the same code but outside the function it works :/ 
$qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'"); 
$ro = mysql_fetch_row($qe); 
$ro[0]+=1; 
mysql_query("UPDATE db SET success_count = '".$ro[0]."' WHERE serial='".$rReq."'"); 
+0

전역 변수를 함수 내에 선언해야합니다. 이 변수가 없으면 $ rReq와 같은 변수는 지역 변수 (빈 값)입니다. – Stan

답변

1

$rReq 변수가 정의되어 있지 함수 범위 안에 있기 때문에 실패합니다. 가능하면 함수의 매개 변수로 전달해야합니다.

또한 오류를 억제하지 않을 것을 권장합니다. 그것은 나쁜 관행으로 간주되며 오류보고가있는 경우 "정의되지 않은 변수 ..."오류가 도움이되었을 것입니다. 외부

function failed() 
{ 
    global $rReq; 
    $qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'"); 
    ... 

변수 :

$rReq 변수 함수 내에서 표시하기 위해서는
0

하면,이 선언 인자로의 전달, 또는 그것을 끌어 global를 사용해야 함수는 그 안에 자동으로 표시되지 않으며 함수 내부의 변수는 외부에서 볼 수 없습니다.

+1

기술적으로 이것이 당면한 질문에 답하는 동안, 1) SQL injection, 2) mysql_ deprecation, 그리고 아마도 3) 두 개의 쿼리가 하나가 될 수 있다는 사실을 언급해야합니다. – DCoder

+0

위의 코드를 사용하는 것보다 훨씬 더 많은 이슈가 있습니다. 이것은 codereview.stackexchange.com이 아닙니다. – Amber

1

쿼리에서 오류를 검사하지 않으므로 잘못된 점을 알리지 않고 실패하지 않습니다. 그것은 수정해야 할 첫 번째 것이되어야합니다. 적절한 오류 검사를 추가하는 방법은 manual 또는 this question을 참조하십시오. 또한 @은 연결시 오류 메시지를 표시하지 않으므로 메시지를 제거하면 잘못된 내용에 대한 정보를 얻을 수 있습니다.

콘크리트 문제는 scope과 관련이 있습니다. 당신과 같이 예를 들어, 함수에 필요한 모든 변수를 전달해야 할 것 :

function failed($rReq, $qe) 
    { 
    .... 
    } 

또한, 코드가 매우 위험하다, SQL injection에 취약 있습니다.

mySQL 확장이 오래되었습니다. 새로운 코드를 작성하는 것은 좋은 생각이 아닙니다. 대체적으로 PDO으로 전환하는 것을 고려해보십시오. 새로운 자료를 배울 때 추가 부담이 있다는 것을 알고 있지만 추가적인 노력이 필요합니다.

+0

덕분에, 이제 저는 이해합니다 : 나는 $ GLOBAL []을 사용했습니다. 그것은 내 모든 코드가 아니야, 나는 antisql 것들을 않습니다. 네, 그건 내 잘못 사촌 내 서버 오류를 표시 해제 – psychoboi111

관련 문제