2011-10-26 2 views
0

이 코드는 주로 내 사이트에 대한 shorurls를 만드는 것을 의미합니다. 그러나 나는 그것을 작동시키지 못합니다. 당신이 그걸로 뭔가 잘못 보입니까? while()을 다른 내부에서 실행해도 괜찮습니까?작동 PHP 코드를 얻을 수 없습니다

$urloriginal = $nt['fecha']."/".$nt['titulolower']; 
mysql_query("SET NAMES 'utf8'"); 
$shortcheck = mysql_query("SELECT * FROM shorturls WHERE urloriginal = '".$urloriginal."' LIMIT 1"); 
while($urlitem = mysql_fetch_array($shortcheck)) { 
    if($urlitem['urloriginal'] != "0") { 
     echo "http://neutronico.com/u/".$urlitem['id']; 
    } else { 
     mysql_close($shortcheck); 
     mysql_query("INSERT into shorturls (urloriginal) VALUES ('$urloriginal')") 
      or die(mysql_error()); 
     $shortget = mysql_query("SELECT * FROM shorturls WHERE urloriginal = '".$urloriginal."' LIMIT 1"); 
     while($urlitem2 = mysql_fetch_array($shortget)) { 
      echo "http://neutronico.com/u/".$urlitem['id']; 
     }; 
     mysql_close($shortget); 
    }; 
}; 

고맙습니다.

+3

작동하지 않는 기능은 무엇입니까? 예상되는 결과는 무엇입니까? 실제 결과는 무엇입니까? – bos

+0

mysql-fetch-assoc을 사용하지 않아야합니까? - http://php.net/manual/en/function.mysql-fetch-assoc.php – Smamatti

+0

몇 가지 간단한 디버깅 작업이 필요합니다. – 472084

답변

4

첫 번째 문제점은 결과 세트에서 mysql_close() 중반 스크립트를 호출하고 있다는 것입니다. 전화를 제거하십시오 :

mysql_close($shortcheck); 

mysql_close()은 데이터베이스 연결 인 자원 링크에서 호출하도록되어 있습니다. 쿼리 결과 리소스가 아닙니다. 스크립트가 종료되면 암묵적으로 호출되므로 특정 메모리 요구 사항이 없으면 호출하지 않아도됩니다. 나는 당신이 mysql_free_result()으로 전화하려고한다고 생각하지만, 이것은 암묵적으로 불려지 고, 당신이 메모리를 관리 할 필요가 없다면 그것을 호출 할 필요가 없다.

나중에이 호출은 MySQL 자원 링크를 닫지 않으므로 제거하십시오.

mysql_close($shortget); 
+0

당신이 맞아요, 그가 이것을 해결 한 후에, 제가 설명한 문제와 당신이 발견 한 SQL 주입의 용의자를 경험하게 될 것입니다. – stivlo

1

네, while 문을 중첩해도 괜찮습니다.

처음에는 발견하지 못했던 주된 문제는 쿼리의 중간에 연결을 닫고 모든 mysql_close 문을 제거한다는 것입니다.

그러나이 문제를 해결 한 후에는 MySQL 연결을 하나만 사용하기 때문에 또 다른 문제가 발생합니다. 두 번째 쿼리는 첫 번째 쿼리의 모든 결과를 잃어 버리기 때문에 첫 번째 행에서 중지하거나 처음으로 else 분기가 실행됩니다.

당신이 '두 가지 옵션 중 하나를 선택할 수 있습니다, 그것이 작동되도록하려면

  • 사용이 MySQL의 연결을하고, mysql_query (string $query [, resource $link_identifier ])
  • 가 첫 번째 쿼리를 실행 $link_identifier 매개 변수와 함께 사용할 하나를 지정, 저장 모든 결과가 배열에 저장되고 다른 쿼리가 실행되므로 쿼리가 겹치지 않습니다. 테이블이 너무 크지 않은 경우에만이 옵션을 사용하십시오.

마이클은 또한 당신의 $urloriginalmysql_real_escape_string()로 소독하거나 SQL 인젝션의 위험에 직면되었는지 확인하기 위해 제안했다.

관련 문제