Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.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 将@someid替换为函数(someid)的返回值_Php_Html_Mysql - Fatal编程技术网

Php 将@someid替换为函数(someid)的返回值

Php 将@someid替换为函数(someid)的返回值,php,html,mysql,Php,Html,Mysql,我正在努力从HTML、PHP和MySQL数据库构建一个社交网络,我不知道如何让这段PHP代码正常工作。请记住,我完全不是PHP专家 我现在正在研究的是一个函数,atreplace($text),它有preg_replace()函数,可以在帖子标题、评论或我使用它的任何地方找到@提及,使它们成为可点击的链接。现在这很简单,除了它将处理的字符串中提到的@是用户id号而不是用户名。例如,我的社交网络帖子标题中的字符串如下所示: “今天和我的朋友@214432和@163728去了迪斯尼乐园。”。但帖子的

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

我现在正在研究的是一个函数,
atreplace($text)
,它有
preg_replace()
函数,可以在帖子标题、评论或我使用它的任何地方找到@提及,使它们成为可点击的链接。现在这很简单,除了它将处理的字符串中提到的@是用户id号而不是用户名。例如,我的社交网络帖子标题中的字符串如下所示: “今天和我的朋友@214432和@163728去了迪斯尼乐园。”。但帖子的标题原本是这样写的:“今天和我的朋友@billysmith和@hi_im_kelly一起去了迪斯尼乐园。”

我编写了一个脚本(不包括在内,因为它与问题无关),该脚本处理post数据并将其插入MySQL数据库中,以替换@References,使其成为所提及用户的用户名id,而不是在人们可能更改用户名的情况下的用户名,这样就不必编辑那些提到某人更改了用户名的人的帖子

问题 当它使用
atreplace(),因为另一个php脚本编辑了它,并将提到的用户名更改为用户id,这是一个数字

这就是我想要的 我想编写一个类似下面的函数(
get\u username($id)
)。我只包括了
get\u username($id)
来显示我想要做什么。关于如何使用
preg\u replace()
函数,我还不太了解。 如您所见,我尝试使用
get\u username('$1)
函数传递$1,这将是我希望它替换为用户名的用户编号id,但它不起作用。(我知道我用错了那1美元)。尽管在
get_username()
函数中,当我尝试返回$id时,它确实正确地输出了用户编号id。但是当我在mysql_query()中使用$id时,它甚至没有出现

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

有人能告诉我如何更改
get\u 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);
}
?>

如果有人遇到过同样的问题,多亏@VolkerK,我才得到了答案

我只是将其更改为一个功能:

function atreplace($text){
$mesg = preg_replace_callback('/\@(\w+)/', 
    function ($match){
        $matchedit = preg_replace('/\@(\w+)/','$1', $match[0]);
        $und = mysql_query("select `username` from `so_profiles` where `id`='".$matchedit."';");
        $un = mysql_fetch_array($und);
        return "<a>@".$un['username']."</a>";
    }, 
$text);
return($mesg);
}
函数替换($text){
$mesg=preg\u replace\u回调('/\@(\w+)/',
函数($match){
$matchedit=preg\u replace('/\@(\w+/),'$1',$match[0]);
$und=mysql_查询(“从`so_profiles`中选择`username`,其中`id`='.$matchedit.';”);
$un=mysql\u fetch\u数组($und);
返回“@”。$un['username']”;
}, 
$text);
回报(百万美元);
}
关于和使用:


@aldrin27这两者有什么区别?试着读一读《非常感谢你》@VolkerK,它解决了我的问题。我花了一段时间才让它工作起来,但我做到了@JeremyBoard:您应该将您的解决方案作为答案发布,如果是这样的话,请将其标记为正确。挑剔的旁注:mysql扩展已被弃用。mysqli和pdo_-mysql都提供预处理语句,在这种情况下,它们可能会稍微降低多次查询的成本。@VolkerK Ok。我真的还不知道mysqli和pdo_mysql。谢谢你花时间写这个人。。。这是一个很大的帮助:)看起来你是唯一一个理解我问题的人。是的,你的问题与
tl;dr
-land但由于我经常鼓励人们告诉我们他们想要实现什么,而不是如何实现,我不能为此责备你;-)是的,我也是这么想的,这就是为什么我很惊讶有人居然花时间回答:)
$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;
}