Как сделать Exect Match на MySQL? - PullRequest
3 голосов
/ 28 ноября 2011

Как сделать абсолютное совпадение запросов MySQL. Так как я получаю коллизию, если пользователь пытается вызвать URL или файл по короткой ссылке domain.ltd/NGV, которая сталкивается с domain.ltd/ngv, вынуждая скрипт выборки извлекать файл / NGV, а не / ngv

Вот код, который делает выбор 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]

и вот последний бит кода, который генерирует реальные короткие ссылки, что также может быть проблемой, так как я не уверен, что отбросило вещь в настоящий момент

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);

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Чтобы получить точное совпадение, вы можете изменить параметры сортировки в столбце qp_tag, чтобы они учитывали регистр символов.Это сопоставления, оканчивающиеся на _cs, например latin1_general_cs.По умолчанию обычно используется сортировка latin1_swedish_ci, которая не зависит от регистра.

1 голос
/ 28 ноября 2011

Если я вас правильно понимаю, вы хотите использовать оператор BINARY для сопоставления с учетом регистра:

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

Это то же самое, что и ваш запрос выше, за исключением того, что я вставилслово BINARY в сравнении.

Обратите внимание, что при этом вы не сможете в полной мере воспользоваться любыми индексами в столбце сравнения.Возможно, это не проблема для вас, но примите это во внимание, если в вашей таблице много строк.

...