Php 如何在mysql\u查询上进行exect匹配?
如何进行绝对MySQL查询匹配。因为如果用户试图通过短链接domain.ltd/NGV调用url或文件时,我似乎会遇到冲突,这会与domain.ltd/NGV冲突,从而强制获取脚本拉取/NGV文件而不是/NGV 下面是执行MySQL选择的代码,还提供了htaccess位Php 如何在mysql\u查询上进行exect匹配?,php,mysql,.htaccess,dynamic-links,Php,Mysql,.htaccess,Dynamic Links,如何进行绝对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).
$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;
}
这里是生成实际短链接的最后一段代码,这也可能是问题所在,因为我不确定目前是什么让事情倒退
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);
如果我理解正确,您希望使用区分大小写的匹配:
$q = mysql_query("SELECT * FROM `media` WHERE BINARY `qp_tag` = '".mysql_escape_string($tag)."' LIMIT 1");
这与上面的查询相同,只是我在比较中插入了单词BINARY
请注意,若这样做,您可能无法充分利用比较列上的任何索引。这对您来说可能根本不是问题,但如果您的表中有很多行,请将其考虑在内。要获得精确匹配,您可以在
qp\u标记
列上设置区分大小写的排序规则。这些是以_cs结尾的排序规则,比如拉丁文1 _general _cs。默认的排序规则通常是latin1\u swedish\u ci
,不区分大小写。我希望进行绝对运算,因此它从mysql中提取正确的文件/url,所以让我们假设url请求是针对qp\u标记下的文件/url:OGG,它将获得该记录,而不是针对OGG、OGG等的记录。。。因为从我现在得到的情况来看,无论您使用OGG还是OGG,它仍然会调用同一个文件,这不是我想要的,我提供的代码应该与之完全匹配。如果$tag是“OGG”,那么使用二进制文件
只能得到带有“OGG”的qp_标签的记录。它不会在“OgG”或“OgG”等位置获取记录。我现在开始怀疑htaccess中是否存在问题?但是,htaccess也没什么用处。所以,在api的实际选择中,基于精确的参数是一个问题tag@PTDesu,请尝试我刚刚发布的更新。我将BINARY
操作符移动到查询中的另一个位置。Great mate:)如果标记与它提供的不匹配,它现在可以工作,否则它会执行它的错误job@PTDesu,如果排序规则为“utf8\u general\u ci”,则您可能可以将其更改为“utf8\u general\u cs”或“utf8\u bin”,以在所有情况下获得区分大小写的字符串匹配(假设没有其他重要内容依赖于排序).BINARY运算符只为一个特定的调用强制转换列。@BenLee实际上它工作正常,如果找不到匹配项,它将失败,我现在遇到的唯一问题是文件选择花费了很长时间,并且挂起了很多。如果您不介意查看代码并告诉我在哪里出错,我会发布代码将文件输出到浏览器如果查询需要很长时间,可能是因为(根据前面提到的警告)它没有使用pg_标记索引。按照@mikel的建议,将排序规则更改为utf8_general_cs,那么您不必使用BINARY
进行区分大小写的搜索,您的索引仍然可用。
$q = mysql_query("SELECT * FROM `media` WHERE BINARY `qp_tag` = '".mysql_escape_string($tag)."' LIMIT 1");