【问题标题】:custom php function in mysql querymysql查询中的自定义php函数
【发布时间】: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) = ...

我的链接过程

  1. 用户以正常的书面形式将文章标题输入数据库
  2. 当页面链接文章时,使用文章的作者标题信息。 正常书写形式被自定义功能覆盖以删除 标点符号和用破折号替换空格

我的目标

从地址栏,$_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


【解决方案1】:

你不能在 mysql 查询中使用 php 函数。这不是它的工作原理。为了您的目的,我将创建一个新行,其中填充了您的 php 函数 noktalamasiz() 的输出。

【讨论】:

    【解决方案2】:

    您无法在 MySQL 查询中运行“自定义 php 函数”。您应该在查询之外运行该函数,从中获取返回值,然后在查询中使用该值。所以你的查询应该是这样的:

    $kolon_baslik = //get your field value first;
    
    $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"
    

    【讨论】:

    • 请引导我正确处理自动链接方式,允许用户在 mysql 表中输入标点标题和只有 1 个标题列。
    • 我现在已经在我的回答中包含了为查询调用你的 php 函数的正确方法。
    • 我现在已经编辑了代码。检查这是否会做你想做的事情。
    • 解析错误:语法错误,第 5 行 ... 中出现意外的 'if' (T_IF)。第 5 行是:if ($beyan = $db_baglanti->prepare($sorgum))跨度>
    • 你有一些 php 语法错误。这告诉您,您在不应该使用的地方使用了 if 语句。你能把你的代码放在那个错误周围吗?错误告诉你它是什么文件,错误在哪一行。
    【解决方案3】:

    您需要在查询之前运行函数,因为您正在执行的操作是不允许的:

    首先,运行 select 语句以获取字段 kolon_baslik。接下来,使用您的函数清理输入:

    $cleanInput = noktalamasiz($kolon_baslik); /* Assumed you've already gotten the value */
    

    最后,使用清理后的输入运行您的查询:

    $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 '" . $cleanInput . "' ='".tire_bosluk_olsun($_GET["rd_nesne"])."'  ORDER by kolon_onaytarihi DESC";
    

    顺便说一下,你可以清理你的函数:

    function noktalamasiz($noktalamali) {
    $noktalamali = trim($noktalamali);
    $ara = array('.',',',';',':','...','?','!','-','—','/','\\','“','”','‘','’','"','\'','(',')','[',']','’','{','}','*','&','#','^','<','>','|');
    $noktalamali = str_replace($ara,'',$noktalamali);
    return $noktalamali;
    }
    

    【讨论】:

    • 我没有 $kolon_baslik 所以我只有来自 url 的 $_GET 作为输入来与我的 MySql 表行值进行比较。
    • 您需要运行另一个选择查询来检索 kolon_baslik 的值 - 然后使用该值,如上所示。
    • 好的,埃文,我会试试的。谢谢你的主意。没有选择查询可以检索 kolon_baslik 的值,因为我无法给出正确的 WHERE 命令。所以也许我利用 SESSION 变量将 kolon_baslik 从一个页面移动到我需要的其他页面。
    • 当然,这是一个非常简单的概念,您只想在进行第二个(主要)查询之前对数据运行该函数。你做的一切都是正确的,只是出了问题。
    【解决方案4】:

    首先,noktalamasiz 不是 mysql 函数,正如您所说的那样,它是一个 php 函数,因此不能将其称为字符串文字,而不仅仅是在 mysql 中,它适用于所有人。 其次,你不能使用任何带有“WHERE”子句的聚合(或内置)mysql函数。

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多