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