3

如何进行绝对 MySQL 查询匹配。因为如果用户试图通过短链接 domain.ltd/NGV 调用 url 或文件,这与 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);
4

2 回答 2

1

要获得完全匹配,您可以将列上的排序规则更改为qp_tag区分大小写的排序规则。这些是以 _cs 结尾的排序规则,例如 latin1_general_cs 。默认排序规则通常是latin1_swedish_ci,不区分大小写。

于 2011-11-28T09:37:12.753 回答
1

如果我理解正确,您想使用BINARY 运算符进行区分大小写的匹配:

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

这与您上面的查询相同,只是我BINARY在比较中插入了单词。

请注意,如果这样做,您可能无法充分利用比较列上的任何索引。这对您来说可能根本不是问题,但如果您的表中有很多行,请考虑到这一点。

于 2011-11-28T09:22:22.560 回答