Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-PDO try/catch插入动态html链接_Php_Mysql_Pdo_Try Catch_Prepared Statement - Fatal编程技术网

PHP-PDO try/catch插入动态html链接

PHP-PDO try/catch插入动态html链接,php,mysql,pdo,try-catch,prepared-statement,Php,Mysql,Pdo,Try Catch,Prepared Statement,在我第一次尝试使用PDO和准备好的语句时,似乎遇到了一个小问题。基本上,我是在一个个人资料页,其中包括一个收件箱的工作。我正在使用try/catch生成收件箱: <?php $sqlin = $db->prepare("SELECT * FROM message WHERE recipientID = (SELECT id FROM members WHERE username = '$pageowner')"); try { while($row = $sqlin->

在我第一次尝试使用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?-我尝试了回显,但在创建代码时遇到了问题。

您必须在准备之前和之后开始尝试/捕获异常。并且请使用准备好的语句,带有准备方法。否则,直接将变量放在查询中会破坏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  } ?>
首先,你根本不应该用try..catch

相反,您必须调用execute并使用prepared语句。 此外,还必须将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$数据作为$row$row[]返回。。无法提取结果。而且,我看不出任何理由,为什么OP不应该使用try/catch