如何进行绝对MySQL查询匹配。因为如果用户试图通过短链接domain.ltd/NGV尝试调用url或文件,这会与domain.ltd/ngv发生冲突,迫使fetch脚本拉/ 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);
答案 0 :(得分:1)
如果我理解正确,您希望使用BINARY operator进行区分大小写的匹配:
$q = mysql_query("SELECT * FROM `media` WHERE BINARY `qp_tag` = '".mysql_escape_string($tag)."' LIMIT 1");
这与上面的查询相同,只是我在比较中插入了单词BINARY
。
请注意,如果执行此操作,您可能无法充分利用比较列上的任何索引。这对你来说可能不是一个问题,但如果你的表中有很多行,请考虑它。
答案 1 :(得分:1)
要获得完全匹配,您可以qp_tag
列change the collation作为区分大小写的排序规则。这些是以_cs结尾的排序规则,例如latin1_general_cs。默认排序规则通常为latin1_swedish_ci
,不区分大小写。