PHP爆炸函数给我一个在mysql查询中不可读的字符串

时间:2017-10-27 20:02:09

标签: php mysql

我有一个字符串($string) 从中我提取username来查询mysql数据库。 我正在使用php explode函数,如下面的代码。

$number是字符串中id的总数。)

对于每个循环,我得到了Mysql数据库的username但是 问题是我的查询不接受它。

例如,我收到了Marta(显示在echo $usercut上),但$query无法正常工作,我无法获得 echo $row['email'];

有趣的是,如果我改变$usercut 输入字符串" Marta" $usercut= "Marta";它有效!!!!!!我得到了echo $row['email'];....这让我发疯了...... 有人知道php explode函数是否在字符串中添加了一些隐藏的字符?

<?php



$string = "<tr id='0r'>Marta</tr0r><tr id='1r'>Paolo</tr1r><tr id='2r'>Carlo</tr2r><tr id='3r'>Esther</tr3r><tr id='4r'>Franceso</tr4r><tr id='5r'>Charles</tr5r>";

str_replace("id=","id=",$string,$number);

for($i=0; $i<= $number; $i++)
{

     $start = "<tr id='".$i."r'>";
     $end = "<\/tr".$i."r>";
     $startHadCut = explode($start, $string) ;
     $endHadCut = explode($end,$startHadCut[1]);    

    echo   $usercut = $endHadCut [0];

$query = "SELECT * FROM `Database` WHERE username = '".mysqli_real_escape_string($link, $usercut)."' LIMIT 1";   
        $row = mysqli_fetch_array(mysqli_query($link, $query));

        echo $row['email'];
}

?>

2 个答案:

答案 0 :(得分:2)

而不是使用explode(),您可以使用一些正则表达式更干净地获得结果,从而做到您想要的结果,因为explode()可能无法返回您期望的结果。

以下是我使用的正则表达式,look aheads and look behinds用于获取标记之间的文本。

(?<=\'>)(.*?)(?=<\/tr)

请注意,我没有必要确定使用了哪个标记,只有标记的部分与从它们之间获取文本相关。

使用preg_match_all()将返回以下数组:

Array
(
    [0] => Array
        (
            [0] => Marta
            [1] => Paolo
            [2] => Carlo
            [3] => Esther
            [4] => Franceso
            [5] => Charles
        )

    [1] => Array
        (
            [0] => Marta
            [1] => Paolo
            [2] => Carlo
            [3] => Esther
            [4] => Franceso
            [5] => Charles
        )

)

现在我可以选择匹配的数组并循环显示结果:

$string = "<tr id='0r'>Marta</tr0r><tr id='1r'>Paolo</tr1r><tr id='2r'>Carlo</tr2r><tr id='3r'>Esther</tr3r><tr id='4r'>Franceso</tr4r><tr id='5r'>Charles</tr5r>";
$pattern = '/(?<=\'>)(.*?)(?=<\/tr)/';
preg_match_all($pattern, $string, $matches);
foreach($matches[0] as $user) {
    $query = "SELECT * FROM `Database` WHERE username = '".mysqli_real_escape_string($link, $user)."' LIMIT 1";   
    $row = mysqli_fetch_array(mysqli_query($link, $query));
    echo $row['email'];
}    

警告

了解preparedMySQLi语句。即使escaping the string也不安全!

答案 1 :(得分:0)

使用preg_match_all()来匹配数据中的模式,而不是explode()

preg_match_all("#<tr id='(\d+)'>(.*)</tr\\1>#", $string, $matches);
foreach ($matches[2] as $usercut) {
    ...
}