【问题标题】:passing quotes through url PHP通过 url PHP 传递引号
【发布时间】:2015-06-11 23:16:08
【问题描述】:

我通过 URL 传递 ProductName,其中 2 个名称中有单引号(这导致按钮无法工作)是否有任何解决方法?我试过玩 htmlentities() 但这并不能解决问题。当我尝试单击名称中包含引号的产品时,我得到了 Uncaught SyntaxError: Unexpected identifier 错误。

    <?php

$search = $_GET['search'];

require 'db/connect.php';


$result = $db->query("SELECT * FROM products WHERE ProductSearch = '$search'");
if($result->num_rows){
echo '<table border="0" cellspacing="0" style="width:100%;">';
echo '<tr><td></td><td><u>Product Name</u></td><td><u>Price</u></td><td><u>Wisconsin Artisans</u></td></tr>';
while($row = $result->fetch_assoc()){
    $ProductId    = $row['ProductId'];
    $ProductImage = htmlentities($row['ProductImage'], ENT_QUOTES, 'UTF-8');
    $ProductName  = $row['ProductName'];
    $ProductPrice = $row['ProductPrice'];
echo '<tr>';
echo '<td><a href="productpage.php?productid=', $row['ProductId'],'"><img height="80px" width="80px "src="', $row['ProductImage'] ,'"/></a></td>';
echo '<td><a id="productlink" href="productpage.php?productid=', $row['ProductId'],'">', $row['ProductName'], '</a></td>';
echo '<td> $', $row['ProductPrice'], '</td>';
echo '<td> ', $row['ProductVendor'], '</td>';
//echo '<td><input type=button onClick="location.href=\'cart.php?ProductId=', $row['ProductId'], '\'" value=\'Add to Cart\' id="addtocart"></td></tr>';
echo '<td><input type=button onClick="location.href=\'cart.php?ProductId=', $ProductId, '&ProductName=', $ProductName, '&ProductPrice=', $ProductPrice, '&ProductQty=1\'" value=\'Add to Cart\' id="addtocart"></td></tr>';
}

echo '</table>';
$result->free();

}
else{

    echo '<h3 style="color:black;">No products here just yet, but there will be soon!</h3>';

}
?>

【问题讨论】:

  • 您可以创建自己的函数将特殊字符转换为其他字符,例如将单引号转换为“;sq;”或类似的东西(发挥你的想象力)。
  • 我将如何处理那个 Jose?我边走边学……
  • 使用 JavaScript = *.com/questions/784586/…
  • 为什么你把$ProductName这样的变量都设置了,而echo语句中却没有用到?

标签: php get


【解决方案1】:

这改变了 'location.href=\'cart.php?ProductId=', $ProductId, '&ProductName=', $ProductName, '&ProductPrice=', $ProductPrice, '&ProductQty=1\'"

对此:location.href=\'cart.php?ProductId='。 $ProductId .'&ProductName='。 $ProductName .'&ProductPrice='。 $ProductPrice .'&ProductQty=1\'"

还可以尝试对多行字符串使用heredoc,并使用花括号来呈现变量值,退出不会有问题:

echo <<<END
multi
line
string
variable={$var}
awesome!
END;

https://php.net/language.types.string

【讨论】:

    【解决方案2】:
    $ProductImage = htmlentities($row['ProductImage'], ENT_QUOTES, 'UTF-8');
    ...
    echo '....', $row['ProductImage'],'">....
    

    您已经将双引号和单引号都转换为它们的 HTML 实体,但是您没有使用在其中执行此操作的变量。您应该在 echo 中使用 $ProductImage 而不是 $row['ProductImage']

    【讨论】:

    • 还应添加有关 SQL 注入的注释。 $search = $_GET['search']; $result = $db-&gt;query("SELECT * FROM products WHERE ProductSearch = '$search'");
    • 哦.... 哎呀哈哈,直到现在我在昏迷状态下运行它都没有遇到任何问题!我用句号替换了所有的昏迷,但仍然出现错误。仅适用于 ProductName 中包含单引号的产品。
    • 可以将单引号替换为 HTML 实体:$str = str_replace("'", "&amp;#39;", $str);
    • echo 允许多个参数,用逗号分隔。
    • @developerwjk 最好使用htmlentities() 进行替换。
    【解决方案3】:

    改变这一行:

    echo '<td><input type=button onClick="location.href=\'cart.php?ProductId=', $ProductId, '&ProductName=', $ProductName, '&ProductPrice=', $ProductPrice, '&ProductQty=1\'" value=\'Add to Cart\' id="addtocart"></td></tr>';
    

    到:

    echo '<td><input type=button onClick="location.href=\'cart.php?ProductId=', $ProductId, '&ProductName=', urlencode($ProductName), '&ProductPrice=', $ProductPrice, '&ProductQty=1\'" value=\'Add to Cart\' id="addtocart"></td></tr>';
    

    urlencode() 将正确编码产品名称,以便将其放入 URL。这会将引号字符转换为%39

    【讨论】:

    • 这就像一个魅力!我如何取消编码后记?我已将它传递到购物车,但现在它显示为 '
    • 这来自于在参数上调用htmlentities()。只有在 HTML 中显示某些内容时才应该这样做,而不是在 PHP 代码中使用它。