简体   繁体   English

如何在mysql_query上进行exect匹配?

[英]how to do exect match on mysql_query?

How to do absolute MySQL query match. 如何做绝对MySQL查询匹配。 Since I seem getting collision if a user is trying to call a url or a file via short link domain.ltd/NGV which collides with domain.ltd/ngv forcing the fetch script to pull /NGV file not /ngv 因为如果用户试图通过短链接domain.ltd/NGV尝试调用url或文件,这会与domain.ltd/ngv发生冲突,强制提取脚本拉/ NGV文件不是/ ngv

Here is the code which does the MySQL selections also the htaccess bit is provided 这是执行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 code bit .htaccess代码位

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

and here is the last bit of code to generate the actual short links which also may be the problem since i am not sure whats kicking the thing back at the present moment 这里是生成实际短链接的最后一段代码,这也可能是问题,因为我不确定在目前这个问题是什么

function qp_tag() {

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

     return $short;

}

Edited: The system works now the only problem is that it lags allot on selecting file if its a file 编辑:系统现在工作唯一的问题是,如果它是一个文件,它会在选择文件时落后

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

If I understand you correctly, you want to use the BINARY operator for case-sensitive matching: 如果我理解正确,您希望使用BINARY运算符进行区分大小写的匹配:

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

This is the same as your query above except I've inserted the word BINARY in the comparison. 这与上面的查询相同,只是我在比较中插入了单词BINARY

Note that it's possible you won't be able to take full advantage of the any indexes on the comparison column if you do this. 请注意,如果执行此操作,您可能无法充分利用比较列上的任何索引。 That may not be an issue at all for you, but take it into consideration if your table has a lot of rows in it. 这可能对您来说根本不是问题,但如果您的表中有很多行,请将其考虑在内。

To get an exact match, you can change the collation on the qp_tag column to be a case-sensitive collation. 要获得完全匹配,可以将qp_tag列上的排序 qp_tag 更改为区分大小写的排序规则。 Those are the collations that end in _cs , like latin1_general_cs . 这些是以_cs结尾的排序规则,例如latin1_general_cs。 The default collation is usually latin1_swedish_ci , which is case-insensitive. 默认排序规则通常是latin1_swedish_ci ,它不区分大小写。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM