0

我的数据库中有一个字段urlOne。如果它有一个 URL 作为值,我希望它只回显 html。这是我的代码:

$id = $_REQUEST['id'];
$query = "SELECT * FROM sites WHERE id = $id LIMIT 1";
$result = mysql_query($query);
$url = $row['urlOne'];
while($row = mysql_fetch_assoc($result)){
    echo "<section class='prop-desc'>";
    echo $desc;
    echo "</section>";
    $result = mysql_query("SELECT * FROM sites WHERE $id LIMIT 1");
    if(!empty($row['urlOne'])){
        echo "<h4 class='cta'><a href='$url'>Launch Site</a></h4>"
    }
}
4

2 回答 2

2

虽然Rab Nawaz 的回答有效,但它并不真正正确。

mysql_*功能不再维护,社区已开始弃用过程。相反,您应该了解准备好的语句并使用PDOMySQLi

如果你不能决定,这篇文章应该可以帮助你选择。虽然,您应该知道,PDO 能够与不同类型的 RDBMS 一起工作,而 MySQLi 是为特定的 RDBMS 设计的。如果您决定使用 PDO,建议您遵循本教程

对于您的特定情况,您的代码应该看起来更像这样:-

$dsn = 'mysql:dbname=dbname;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$id = someMethodOfValidation($_POST['id']);

注意:-您应该指定 $_POST 或 $_GET;因为 $_REQUEST 可能来自任何一个,您应该始终知道您的输入来自哪里。

应始终验证用户输入,您的方法使您对 SQL 注入敞开大门,因此someMethodOfValidation()您需要编写适合您预期输入的位。在您的情况下,您似乎期望一个整数值,因此您的验证可能像$id = (int)$_POST['id'];.

在谈论 SQL 注入时,传统的做法是讲述 Little Bobby Tables 的故事,所以这里是:-

在此处输入图像描述

要继续您的代码:-

$stmt = $db->prepare("SELECT * FROM sites WHERE id=:id");
$stmt->execute(array(':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rows as $row){
    if(!empty($row['urlone']){
        echo "<h4 class='cta'><a href='{$row['urlone']}'>Launch Site</a></h4>";
}

我不能强调你上面的代码是不安全的,永远不应该在实时服务器上使用。不要费心学习使用 mysql_* 函数,你会浪费你的时间。PDO 并不难学,事实上,一旦你掌握了它,它就非常简单。上面链接的教程将帮助您顺利使用 PDO。

于 2012-07-10T08:21:57.730 回答
0

第一的。你错过;了 echo 语句的结尾。我不确定,是否是复制粘贴问题。

第二。为什么不检查 $url。如果是关于 $url 打印

if(!empty($url)){
echo "<h4 class='cta'><a href='$url'>Launch Site</a></h4>";
}
于 2012-07-09T19:02:43.220 回答