【问题标题】:PHP-PDO try/catch inserting dynamic html linkPHP-PDO try/catch 插入动态 html 链接
【发布时间】:2013-11-16 01:09:39
【问题描述】:

似乎我在第一次使用 PDO 和准备好的语句时遇到了一个小问题。基本上我正在处理一个包含收件箱的个人资料页面。我正在使用 try/catch 来生成收件箱:

<?php
$sqlin = $db->prepare("SELECT * FROM message WHERE recipientID = (SELECT id FROM members WHERE username = '$pageowner')");
try {
    while($row = $sqlin->fetch(PDO::FETCH_ASSOC)){
    ?>
    <br><a href="inbox.php?id=<?php echo $row['idmessage'] ?>"><?php echo $row['title'] ?></a>
    <?php 
    }
}
catch(PDOException $e) {
    die ($e->getMessage()); 
}
?>

所以这应该将用户 ID 与收件人 ID 相关联,然后创建指向消息的链接。当我在浏览器中运行时,没有列出任何链接

这是我的 try/catch 语法中的问题吗?也许停止 php 并插入 html?--我尝试回显,但在创建该代码时遇到了问题。

【问题讨论】:

    标签: php mysql pdo try-catch prepared-statement


    【解决方案1】:

    您必须在 prepare() 之前和之后开始尝试/捕获异常。并且请使用准备好的语句,使用prepare() 方法。否则,您将通过直接将变量放在查询中来破坏 PDO 的目的。这不会使您的脚本免受 mysql 注入的影响。

    $pageOwner = 'some external data';
    try {
       $sqlin = $db->prepare("
            SELECT * FROM message 
            WHERE recipientID = (
                 SELECT id
                 FROM members 
                 WHERE username = ?
                 ) 
            ");
    
        $sqlin->execute(array($pageOwner)); 
    
         }catch(PDOException $e){
            die ($e->getMessage()); 
         }
    
         while($row = $sqlin->fetch(PDO::FETCH_ASSOC)){
    ?>
    
    <br><a href="inbox.php?id=<?= $row['idmessage'] ?>"><?= $row['title'] ?></a>
    
    <?php  } ?>
    

    【讨论】:

    • @ramboramos 没问题。如果您觉得此答案有帮助,请考虑接受。
    【解决方案2】:

    首先,你根本不应该在这里使用 try..catch。

    相反,您必须调用 execute() 并使用准备好的语句。 此外,您必须将 SQL 与 HTML 分开。 这是正确的代码。

    <?php
    $sql = "SELECT m.* FROM message m, members mm WHERE recipientID = mm.id and username = ?";
    $stm = $db->prepare($sql);
    $stm->execute([$pageowner]);
    $data = $stm->fetchAll();
    ?>
    <?php foreach ($data as $row): ?>
        <br><a href="inbox.php?id=<?=$row['idmessage'] ?>"><?=$row['title'] ?></a>
    <?php endforeach ?>
    

    【讨论】:

    • 你的实现是错误的。 fetchAll() 返回多维数组,所以foreach($data as $row) $row[].. 将无法提取结果。而且,我看不出任何理由,为什么 OP 不应该使用 try/catch
    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 2012-08-14
    • 2010-12-27
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多