【问题标题】:Concatenate Avatar to a Chat Message将头像连接到聊天消息
【发布时间】:2016-11-10 02:58:16
【问题描述】:

我想将用户头像连接到他们在聊天系统中发送的消息。目前,我已经发展到在聊天中显示每个用户的图像 name.jpg (意思是:我有一个每个用户的 ID 到 INDEX)

我现在需要拥有它,以便它使用以下代码在聊天中显示为头像

<?php echo  "<img width='100' height='100' src='avatars/".$row['imagelocation']."' alt='Profile Pic'>"; ?>

我想将此处包裹在 span 中的头像显示到 $new_str 中,这是要发送的消息

    <div id="chat_data">

        <span style ="color:orange; font-size:10px;"><?php echo "<a href=http://localhost/db/view_member.php?id=".$row['username'].">My Profile </a>"?><span style ="color:o; font-size:24px;"><?php echo " |".$row['username']." says :"; ?></span></span> 

        **//LINE I WANT TO ADD THE AVATAR TO**
        <span style ="color:white; font-size:20px;"><?php echo $new_str ;?></span>

        <span style ="float:right; color:brown;"  ><?php echo $row['date']; ?></span>

        //THIS LINE DISPLAYS THE IMAGE BUT ON ALL LINES IN THE CHAT
        <span style ="float:right; color:brown;"  ><?php echo $row['imagelocation']; ?></span>


    </div>

上面的第三个 span 标记显示用户头像,但在所有消息上我的查询是从表中选择所有内容,以便所有用户都可以看到消息,我怎样才能让我的查询显示和头像的每一行上的每个用户他们发送的消息(我使用 ID 作为每个用户的索引),但我一直试图在该用户的消息的每一行显示头像

如果我在下面包含 WHERE CLAUSE 来索引用户的 ID,则聊天不会向聊天中的所有其他用户显示所有内容。

$query = "SELECT * FROM chat ORDER BY id DESC";
    $run = $con->query($query);
    while($row = $run->fetch_array()):
    $new_str = str_replace($row['msg']);



?>

我的表格结构 AVID 是用户 ID 表格聊天

下面是我的查询显示我如何获取 ID 和图像路径,然后更新 table tbl1

 if(isset($_POST['submit'])){  // RETRIVE + UPLOAD THE IMAGE AVATAR FOR THE USER IF THEY SUBMIT A IMAGE TO UPLOAD
            move_uploaded_file($_FILES['file']    ['tmp_name'],"avatars/".$_FILES['file']['name']);
            include('..\db.php');
  $con = mysqli_connect($dbsrvname, $dbusername, $dbpassword, $dbname);
            $q = mysqli_query($con,"UPDATE tbl1 SET imagelocation = '".$_FILES['file']['name']."' WHERE username = '".$_SESSION['CurrentUser']."'");
           // $me = mysqli_query($con,"UPDATE chat SET imagelocation = '".$_FILES['file']['name']."' WHERE username = '".$_SESSION['CurrentUser']."'");
    }
    }

注意安全尚未应用于头像上传选项

<form>
<textarea name="msg" placeholder="enter message"></textarea> 
<input type="submit" name="submit" value="Send"/>
</form>

<?php
if(isset($_SESSION['CurrentUser'])){ // if session is true
if(isset($_POST['submit'])){
$name = $_SESSION['CurrentUser'];
$msg =  $_POST['msg'];

// GET THE NAME OF FILE FOR THE PATH
$q = mysqli_query($con,"SELECT * FROM tbl1 WHERE username = '".$_SESSION['CurrentUser']."'");
                        while($row = mysqli_fetch_assoc($q)){
                                echo $row['imagelocation'];
                                $path = $row['imagelocation'];


                        }

////////// SELECT FROM TBL1 TO GET ID OF USER (separate query )
 $q = mysqli_query($con,"SELECT * FROM tbl1 WHERE username = '".$_SESSION['CurrentUser']."'");
                        while($row = mysqli_fetch_assoc($q)){
                        echo $row['id'];
                        $onlineid = $row['id'];
                                }



////////// INSERT USERNAME MSG AND TIME + ID OF USER  NAME OF FILE
$query = "INSERT INTO chat (username,msg,date,avid,imagelocation) values ('$name','$msg', now(),'$onlineid','$path')";
$run = $con->query($query);

$me = mysqli_query($con,"UPDATE chat SET imagelocation = '".$path."' WHERE username = '".$_SESSION['CurrentUser']."'");


}
 }
 else {
     echo "You Need to Login to type in this chat";
 }
?>

注意:安全性尚未应用于我的查询 提前致谢

【问题讨论】:

  • 听起来你需要做一个join:select * from msgs join users on msg.userid = users.id,这样你才能得到你的头像路径。
  • @MarcB 你能纠正我的查询吗,我还是不确定。
  • 言归正传,但您错过了很多安全检查 - 在推进您的软件之前,我会关注您的安全性(即:查询中的 SQL 注入 - 使用 PDO 准备语句!,文件上传 - 你没有检查它的图像而不是恶意脚本!,数据加密 - 使用 SHA256!)
  • @KyleThomas 这不是在实时环境中,我必须稍后对所有查询应用安全性。感谢您指出这一点。我将研究 SHA256
  • 我已经添加了一个答案供您查看@0v3kShi3ld3r - stackoverflow.com/a/38256566/5897602

标签: php mysql


【解决方案1】:

如何根据用户在我的软件中显示拼接图像:涵盖安全问题

首先,您需要确定您不能在没有使命宣言(计划)的情况下跳入编码。

让我们从您的数据库层次结构开始,我们已经知道我们需要一个用户,并且该用户需要身份验证,因此需要登录和注册。

USER_TABLE :
    uid (int) 255 PK AUTO_INCREMENT
    username (varchar) 30 UNIQUE
    salt (varchar) 22 UNIQUE
    hash (varchar) 120 UNIQUE
    rcab_rank (int) 255
    email (varchar) 60
    member_since (timestamp) CURRENT_TIMESTAMP
    image_url (varchar) 120
    session_key (varchar) 18 UNIQUE

我想在这里强调几件事的重要性,拥有唯一的会话密钥会使人们更难会话劫持或对您的客户/成员进行社会工程。使用加密意味着如果发生数据泄露,攻击者无法使用敏感数据,而您需要花费大量时间来提醒您的成员/客户。

但是继续前进,如您所见,我在您的结构中添加了一个 RCAB 模块,这意味着您现在可以通过创建一个等级表并为每个等级特权和一个唯一的等级 ID(您的当然需要编码)。

现在确定软件的最佳安全方法很重要,这意味着要使用哪些连接驱动程序以及如何安全地使用每个驱动程序。在这个例子中,我会为你提供一个书面的 PDO 对象:

namespace ProjectName\App\Drivers;

interface MyConnection {
    public function query($statement, array $values = []);
}

class Database extends \PDO implements MyConnection {

    public function __construct(
        array $config = ['mysql:host=X;dbname=X', 'user', 'pass']
    ) {
        try {
            parent::__construct($config[0],$config[1],$config[2]);
        } catch (PDOException $ex) {
            die($ex->getMessage());
        }
    }

    public $Result;

    public function query(
        $statement, array $values = []
    ) {
        $smpt = parent::Prepare($statement);
        (empty($values)) ? $smpt->execute() : $smpt->execute($values);
        $this->Result = $smpt;
        return $this;
    }
}

你可以像这样使用这个对象:

require_once dirname(__FILE__) . '/path/to/file/pdo.php';
$con = new ProjectName\App\Drivers\Database();
$smpt = $con->query('SELECT * FROM table WHERE column = ?', ['value'])->Result;
foreach($smpt->fetchAll() as $row):
    echo $row['column'];
endforeach;

现在很重要的是首先散列(单向加密)您的成员/客户凭据:

Click here 查看有关为您的 salt 和会话密钥创建随机字符串的相关 StackOverflow 问题。

$password = $_POST['password'];
$salt = 'UNIQUE STRING';
$hash = hash('SHA256', $password.$salt);

$con->query('INSERT INTO table (salt,hash) VALUES (?,?)', [$salt,$hash]); // ect..

最后,检查您的上传类型很重要 - 除非您保护自己,否则任何用户都可以使用文件上传器轻松将恶意脚本上传到您的服务器:话虽如此,永远不要检查文件扩展名 - 您应该始终检查文件 @987654322 @。

总之,安全性是软件的重要组成部分,防止它可能看起来很头疼,但您稍后会感谢我的 ;)。

最后要说的是,在上传到服务器上的图像目录之前,您应该将文件重命名为 $_FILES['upload']['name'] = time() . '-' . $user_id_here 之类的名称,然后只需将该图像路径存储在数据库中自己的表中,即可将其添加到您的聊天中。通过用户 ID 引用用户。

【讨论】:

    【解决方案2】:

    我知道这与您的方式不同,但它仍然可以提供相同的结果,而且方式更简单。

    您可以创建一个可以从任何地方调用的函数,只要您拥有唯一的用户id。像这样:

    function get_user($user, $field) {
        // run your db connection here with $con as your db variable, remember we are using `mysqli` and not `mysql`
        $query = mysqli_query ($con, "SELECT $field FROM users_table WHERE id='$user'");
        $sql = mysqli_fetch_array($query);
        $value = $sql[$field];
        return $value;
    }
    

    这样你不仅可以获取用户图片,还可以获取用户表中用户的每个值,只要你有id,所以你可以说:

    $image = get_user($user_id, 'imagelocation');
    $name = get_user($user_id, 'username');
    

    以此类推。我通常会在我的所有页面中包含的外部页面中运行此功能。

    希望对你有帮助

    【讨论】:

    • 谢谢,这确实有帮助。但是我有图像位置和用户 ID,可以随时索引。我需要更正的查询以在发送的消息中包含每个用户的文件路径,但对于每个用户,我认为 JOIN 是我需要的,但不能遵循给出的示例
    • 好的,如果是这样的话,我认为您应该向我们展示所需的两个表及其连接,以便我们知道如何为您编写查询
    • 我添加了代码来显示我如何获取 ID 和图像路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多