【发布时间】:2013-03-24 13:44:28
【问题描述】:
下面是我的查询
工作查询
$sorgum = "SELECT kolon_etiketler, kolon_yazar, kolon_baslik, kolon_resim_baslik, kolon_resim_url, kolon_yazi, kolon_ytarihi FROM tb_yazilar WHERE kolon_statu = 'onay' AND kolon_yazar ='".tire_bosluk_olsun($_GET["rd_ozne"])."' AND kolon_baslik ='".tire_bosluk_olsun($_GET["rd_nesne"])."' ORDER by kolon_onaytarihi DESC";
非工作查询
$sorgum = "SELECT kolon_etiketler, kolon_yazar, kolon_baslik, kolon_resim_baslik, kolon_resim_url, kolon_yazi, kolon_ytarihi FROM tb_yazilar WHERE kolon_statu = 'onay' AND kolon_yazar ='".tire_bosluk_olsun($_GET["rd_ozne"])."' AND noktalamasiz(kolon_baslik) ='".tire_bosluk_olsun($_GET["rd_nesne"])."' ORDER by kolon_onaytarihi DESC";
工作和不工作的区别
工作:AND kolon_baslik = ...
非工作:AND noktalamasiz(kolon_baslik) = ...
我的链接过程
- 用户以正常的书面形式将文章标题输入数据库
- 当页面链接文章时,使用文章的作者标题信息。 正常书写形式被自定义功能覆盖以删除 标点符号和用破折号替换空格
我的目标
从地址栏,$_GET['nesne'] 来了。这是文章标题的没有任何标点符号的语法。空格字符也替换为破折号。
在我的 MySQL 表中,文章标题采用标准格式,带有标点符号和空格 btw 单词。
示例:
在我的 MySql 表中:“是约翰的Clock Working?”,在url地址中变成“Is-Johns-Clock-Working”
我的问题
我可以用非工作查询做些什么吗?我无法将其删除的标点符号赋予$_GET['nesne'],因此我需要比较mysql表中标题行的无标点符号状态的值和$_GET['nesne']。也许我走错了路,所以请引导我正确处理自动链接方式,允许用户在 mysql 表中输入标点标题和只有 1 个标题列。
编辑
noktalamasiz = 删除所有标点符号的自定义 php 函数。
tire-bosluk-olsun = 用空格替换破折号。因此,如果我的第一个标题不包含任何标点符号,而只包含空格 btw 单词,那么我将没有困难,只使用工作 sql。
function tire_bosluk_olsun ($tireli)
{
$tireli = trim($tireli);
$tireli = str_replace('-',' ',$tireli);
return $tireli;
}
function noktalamasiz($noktalamali) {
$noktalamali = trim($noktalamali);
$ara = array('.',',',';',':','...','?','!','-','—','/','\\','“','”','‘','’','"','\'','(',')','[',']','’','{','}','*','&','#','^','<','>','|');
$degistir = array('','','','','','','',' ','','','','','','','','','','','','','','','','','','','','','','',);
$noktalamali = str_replace($ara,$degistir,$noktalamali);
return $noktalamali;
}
什么是不工作
如果我的查询涉及noktalamasiz custom function,则为:noktalamasiz(kolon_baslik);然后我得到了空白屏幕,没有任何警告通知或错误。我正在处理 -1 错误级别。
整个相关的php代码
$sorgum = "SELECT kolon_etiketler, kolon_yazar, kolon_baslik, kolon_resim_baslik, kolon_resim_url, kolon_yazi, kolon_ytarihi FROM tb_yazilar WHERE kolon_statu = 'onay' AND kolon_yazar ='".tire_bosluk_olsun($_GET["rd_ozne"])."' AND noktalamasiz(kolon_baslik) ='".tire_bosluk_olsun($_GET["rd_nesne"])."' ORDER by kolon_onaytarihi DESC";
if ($beyan = $db_baglanti->prepare($sorgum))
{
/* execute statement */
$beyan->execute();
/* bind result variables */
$beyan->bind_result($etiketler, $yazar, $baslik, $resim_baslik, $resim_url, $yazi, $ytarihi);
/* fetch values */
while ($beyan->fetch())
{
echo '<div class="sol-icerik-kapsar">'."\r\n";
echo "\t".'<h1>'.$baslik.'</h1>'."\r\n";
echo "\t".'<img class="mansetresim" width="120" height="160" src="'.sitenin_koku.'img/manset/'.$resim_url.'" alt="'.$resim_baslik.'" title="'.$resim_baslik.'" />'."\r\n";
echo "\t".'<p><a href="'.sitenin_koku.'yazılar/'.bosluklar_tire_olsun($yazar).'">'.$yazar.'</a>'.' - '.turkcetarih('j F Y',$ytarihi).'</p>'."\r\n";
echo "\t".'<p>'.$yazi.'</p>'."\r\n";
echo "\t".'<p>'.$etiketler.'</p>'."\r\n";
echo '</div>'."\r\n";
}
/* close statement */
$beyan->close();
}
【问题讨论】:
-
什么是
noktalamasiz? -
你也可以发布非工作查询的mysql错误吗?
-
tire_bosluk_olsun是做什么的?它是否调用mysql_real_escape_string? -
你能指定什么是“不工作”吗?它是否返回错误,是否返回错误结果,是否仅返回一个子集?此外,这是所有注入问题的根源(除非 'tire_bosluk' 是某种逃避):永远不要只将 $_GET 中的内容放入查询中。即使只是开始,也很糟糕。您不应该“稍后添加安全性”。阅读参数化查询!
标签: php mysql user-defined-functions punctuation