我试图找到一种方法,以便preg_replace允许URL中的所有内容....
目前我的代码允许space
,/
和alphabetical
个字符....
首先,我需要知道是否有办法允许一切,我的意思是preg_replace中的每个字符?
如果没有,那么我需要允许+
和-
以及_
和'
以及++
基本上所有特殊字符?
这是我目前的代码:
$category = preg_replace('/[^i<>@&\/\sA-Za-z0-9_]/', '', $_GET['category']);
有人可以帮我解决这个问题吗?
提前致谢
编辑:抱歉,我应该更好地解释一下:我正在网上商店PHP / mysql ...
我正在尝试在类别列表页面中显示每个类别下的产品。
例如:
当有人点击类别1时,类别1下的产品将是p1,p2,p3等,它们将从mysql数据库中提取出来,如下所示:
<?php
if (isset($_GET['category'])) {
// Run a select query to get my letest 6 items
// Connect to the MySQL database
include "config/connect.php";
$category = preg_replace('/[^i<>@&\/\sA-Za-z0-9_]/', '', $_GET['category']);
$cList2 = "";
$sql = "SELECT * FROM products WHERE category='".$category."' LIMIT 35" ;
$query = mysqli_query($db_conx, $sql);
$productCount = mysqli_num_rows($query); // count the output amount
if ($productCount > 0) {
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){
$id = $row["id"];
$product_name = $row["product_name"];
$price = $row["price"];
$category = $row["category"];
$details = $row["details"];
$stock = $row["stock"];
$date_added = strftime("%b %d, %Y", strtotime($row["date_added"]));
$cList2 .= '<table style="border:solid 1px #EBEBEB; margin-top:10px;" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="3%"> </td>
<td width="21%"><a href="product.php?id=' . $id . '"><img style="border:solid 1px #E2E2E2; margin:10px;" src="inventory_images/' . $id . 'Image1.jpg" width="124" height="124" /></a></td>
<td width="4%"><div style="border-right:solid 1px #E2E2E2; width:2px; height:120px; margin-left:5px;"></div></td>
<td valign="top" width="48%"><table style="margin-left:10px;" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td> </td>
</tr>
<tr>
<td style="font-size:16px; font-weight:bold;"><a href="product.php?id=' . $id . '">' . $product_name . '</a></td>
</tr>
<tr>
<td><div style="font-weight:normal; text-align:left; height:90px; overflow:hidden; margin-top:10px;">' . $details . '</div></td>
</tr>
</table></td>
<td valign="top" width="24%"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td> </td>
</tr>
<tr>
<td height="40"><strong style="color:#999;">Price:</strong> £' . $price . '<br/>' . $stock . '</td></td>
</tr>
<tr>
<td><form method="post" action="product.php?id=' . $id . '"><input type="submit" class="button" name="button" id="button" value="Add to cart" /></form></td>
</tr>
</table>
</td>
</tr>
</table>';
}
}
} else {
$cList2 = "We have no products listed in our store yet";
}
?>
因此,某些类别名称包含一些特殊字符,例如+
符号或-
符号或++
符号等...目前具有+
符号的类别{ {1}}符号或++
符号不会在类别列表页面中显示其产品但是当我删除-
符号或+
符号等时,他们会正确显示其产品!
这就是我想要解决的问题。
编辑:这是我如何添加/插入我的产品到db:请忽略mysql查询,因为我将完成其余的生产后将其更改为mysqli ....
-
答案 0 :(得分:0)
默认情况下,所有内容都包含在字符串中。您没有从一开始就告诉我们您要将此字符串放入数据库中,然后将其解压缩以显示给用户。
在这种情况下,你不需要打破查询字符串,同时也不要显示像\'
这样的转义引号我们都是用户,我们都知道没有人希望他的名字是{{1 }}
我看到她的最快方法是将特殊字符解码为实体,然后以他希望他们看到的方式将其输出回用户。
逻辑流程很简单。例如:用户输入整数O\'Brian
但由于某种原因{}不允许使用5
字符。您的密码系统会发出警报并进行简单加密,您可以向其添加5
。所以你在db中插入整数+1
。当您稍后提取此字符时,您知道它已加密,您只需从中减去6
即可对其进行解密。所以你再次输出5。
非常粗略的例子
-1
在此示例中,您可以在不中断查询字符串的情况下查询数据库,因为发送了原始引号,并且您可以毫无问题地向用户输出已解码的值 - 如果您尝试打印实体,它们将显示为特殊字符最终用户,但不会以数据库形式插入数据库。
点击此处http://php.net/htmlentities和http://php.net/manual/en/function.html-entity-decode.php