我有一个字符串($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'];
}
?>
答案 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'];
}
了解prepared的MySQLi语句。即使escaping the string也不安全!
答案 1 :(得分:0)
使用preg_match_all()
来匹配数据中的模式,而不是explode()
。
preg_match_all("#<tr id='(\d+)'>(.*)</tr\\1>#", $string, $matches);
foreach ($matches[2] as $usercut) {
...
}