2011-11-28 2 views
3

절대 MySQL 쿼리 일치를 수행하는 방법. 사용자가 domain.ltd/ngv와 충돌하는 짧은 링크 domain.ltd/NGV를 통해 URL/파일을 호출하려고하면/NGV 파일이 아닌/NGV 파일을 가져 오도록 강제합니다.mysql_query에서 exect match를 수행하는 방법은 무엇입니까?

여기에 충돌이 발생합니다. MySQL의 선택을 수행하는 코드는 또한 htaccess로 비트는 실제 짧은 링크를 생성하기 위해 여기에 코드의 마지막 비트입니다

$tag = $_REQUEST['rid']; 

$q = mysql_query("SELECT * FROM `media` WHERE `qp_tag` = '".mysql_escape_string($tag)."' LIMIT 1"); 

$r = mysql_fetch_row($q); 

if(!empty($r)) { 

    $f = stripslashes($r['file']); 
    $t = stripslashes($r['type']); 

    $c = file_get_contents($f); 

    $api_html = <<<API_HTML_VIEW 
    $c 
      API_HTML_VIEW; 

    echo $api_html; 

} else { 

    $api_html = <<<API_HTML_VIEW 
    We are sorry but we cannot find requested resource :(
      API_HTML_VIEW; 

    echo $api_html; 

} 

htaccess로 코드 비트

RewriteRule ^([a-zA-Z0-9-]+)/?$ api.php?rid=$1 [L,QSA] 

를 제공하고되는도 할 수있다 문제는 내가 p에서 물건을 다시 걷어 올지 모르겠다.

function qp_tag() { 

    $file_tag = $_FILES['file']['name']; 
    $file_uni = uniqid(); 
    $short = strtolower(substr(base64_encode(crc32($file_tag)), 0, 3)); 

    return $short; 

} 

편집 순간에 분개 : 시스템이 작동 이제 유일한 문제는 그것이 내가 제대로 이해하면의 경우 파일

$f = $r['file']; 
$t = $r['type']; 
$s = $r['size']; 
$n = $r['name']; 

header("Pragma: public"); // required 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: ".$t.""); 
header("Content-Disposition:attachment;filename=".$n.""); 
header("Content-Length: ".$s); 
ob_clean(); 
flush(); 

$fp = fopen($f, "r"); 
while (!feof($fp)) 
    { 
     echo fread($fp, 65536); 
     flush(); // this is essential for large downloads 
    } 
fclose($fp); 

답변

1

파일을 선택에 충당 지연, 당신은 BINARY operator에 사용할 대소 문자를 구분 일치 :

$q = mysql_query("SELECT * FROM `media` WHERE BINARY `qp_tag` = '".mysql_escape_string($tag)."' LIMIT 1"); 

이 내가 비교 단어 BINARY을 삽입 한 것을 제외하고 위의 쿼리와 동일합니다.

이렇게하면 비교 열의 모든 색인을 최대한 활용할 수 없습니다. 그것은 전혀 문제가되지 않을 수도 있지만 테이블에 많은 행이 있으면 고려해야합니다.

+0

내가 올바른 파일/URL을 mysql에서 가져 오도록 url 요청이 qp_tag 아래의 파일/url에 대한 것임을 알리는 절대적인 수학 연산을 원한다 : OGG는 OGG가 OgG, OGG 등의 기록을 남기지 않는다. OGG 또는 OGG를 사용하면 여전히 원하는 파일이 아닌 동일한 파일을 호출 할 수 있습니다. –

+0

예, 제공된 코드는 이와 같이 정확하게 일치해야합니다. $ tag가 "OGG"이면, "BINARY"를 사용하면 정확히 qp_tag가 "OGG"인 레코드 만 얻을 수 있습니다. "OgG"또는 "oGG"등의 기록을 얻지 못할 것입니다 ... –

+0

지금 htaccess에서 문제가 될지 궁금해지기 시작 했습니까? 그러나 다시 htaccess는 많은 일을하지 않습니다. 그래서 정확한 태그를 기반으로 실제 선택의 API에 문제가 있습니다 –

1

정확한 일치를 얻으려면 qp_tag 열의 change the collation을 대소 문자를 구분하는 것으로 지정할 수 있습니다. latin1_general_cs와 같이 _cs로 끝나는 데이터 정렬입니다. 기본 데이터 정렬은 보통 latin1_swedish_ci이며 대/소문자를 구분하지 않습니다.

+0

해당 utf8_general_ci –

+0

@PTDesu, 데이터 정렬 "utf8_general_ci"다음 "utf8_general_cs"또는 " utf8_bin "을 사용하여 대소 문자를 구분하는 문자열을 얻을 수 있습니다 (중요한 것은 그 데이터 정렬에만 의존한다고 가정). BINARY 연산자는 특정 호출에 대해서만 열을 캐스팅합니다. –

+0

@BenLee 실제로 잘 작동합니다. 일치하는 항목이 없으면 실패합니다. 파일을 선택하면 저녁 시간이 오래 걸리고 꽤 많이 멈 춥니 다. 만약 당신이 그것을보고 신경 쓰지 않고 브라우저에 파일의 출력을 건네기 위해 잘못 가고 있다고 말하면 코드를 게시 할 것입니다. –

관련 문제