php - 用函数的返回值替换@someid(someid)

标签 php html mysql

我正致力于从 HTML、PHP 和 MySQL 数据库构建一个社交网络,但我不知道如何让这个 PHP 代码工作。请记住,我完全不是 PHP 专家。

我现在正在研究的是一个函数,atreplace($text),其中包含 preg_replace() 函数,用于查找 @ 提及项发布标题、评论或我在其他任何地方使用它,使它们成为可点击的链接。现在这很容易,除了它要处理的字符串中的@mentions 是用户 ID 号而不是用户名。例如,我的社交网络帖子标题中的字符串如下所示: “今天和我的 friend @214432 和@163728 去了迪斯尼乐园。”。但是帖子标题最初是这样说的:“今天和我的 friend @billysmith 和@hi_im_kelly 去了迪斯尼乐园。”。

我编写了处理发布数据并将其插入 MySQL 数据库的脚本(未包括在内,因为它与问题无关)以替换 @ 提及为用户的用户编号 id在人们会更改用户名的情况下提及而不是用户名,那么它就不必编辑人们提到有人更改了用户名的帖子。

问题

当它使用 atreplace() 函数在有人查看他们的提要时回显帖子标题时,当然它会回显“@214432”和“@163728”(来自示例上面)在帖子标题中而不是我期望的“@billysmith”和“@hi_im_kelly”,因为不同的 php 脚本编辑了它并更改了提到的用户名作为用户 ID,这是一个数字。

这就是我想要的

我想编写一个函数,如下面的函数 (get_username($id))。我只包括 get_username($id) 来展示我想做什么。我还不太了解如何使用 preg_replace() 函数。 如您所见,我尝试使用 get_username('$1) 函数传递 $1,这将是我希望它用用户名替换的用户编号 ID,但它不起作用. (我知道我以某种方式错误地使用了 1 美元)。虽然在 get_username() 函数中,当我尝试返回 $id 时,它确实正确输出了用户编号 id。但是当我在 mysql_query() 中使用 $id 时,它甚至没有出现。

如果您不理解所有这些,首先,我想将其中包含 @ 提及的字符串放入 atreplace() 函数中。此函数将查找所有@user 提及项,请记住,它们是用户编号 id。然后,它会将每个提及项放入 get_username() 函数中。该函数将从 mysql 数据库中获取用户名,其中 id 等于 atreplace() 函数找到的用户编号 id,然后它将返回用户名,最后将替换 @mention ...

有人可以告诉我如何更改 get_username() 函数以使其工作吗?或者只是写一个新的。

<?php
function get_username($id){
    $undata = mysql_query("select `username` from `accounts` where `id`='$id';");
    $un = mysql_fetch_assoc($undata);
    return "<a href='#'>@".$un['username']."</a>";
}

function atreplace($text){
    $replaced = preg_replace('/\@(\w+)/', get_username('$1'), $text);
    return($replaced);
}
?>

最佳答案

关于 mysql_* being deprecated并使用 prepared statements连同 preg_replace_callback :

$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false,
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
...

function atreplace($text, $pdo) {
    $stmt = $pdo->prepare('
        SELECT
            `username`
        FROM
            `so_profiles`
        WHERE
            `id`=?
    ');

    $mesg = preg_replace_callback(
        '/\@(\w+)/', 
        function ($match) use($stmt) {
            $stmt->execute( array($match[1]) );
            $users = $stmt->fetchAll(); // yes, there should be only one....
            return empty($users) ? '[unknown user]' : $users[0];
        },
        $text
    );

    return $mesg;
}

关于php - 用函数的返回值替换@someid(someid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32283668/

相关文章:

javascript - 如何获取mp3文件的大小和持续时间?

php - 使用 php 自动化 UNION Mysql 查询

javascript - 如何自动选择多选框chzn-select-deselect?

mysql - 我已经对组合列建立了索引,是否也应该对单独的列建立索引?

java - Java 准备语句中的通配符问题

php - 在 Nginx 反向代理后面运行 Apache(使用 .htaccess)应用程序

javascript - Chart.js 在保持宽高比的同时更改窗口调整大小的高度

django - 在多个 django 模板中重用相同的 "block"html

javascript - jQuery Mobile - 如果选择输入,则固定标题更改大小

php - 如何正确显示存储在 MySQL 数据库中的不可读字符