将头像连接到聊天消息

时间:2016-07-07 17:08:22

标签: php mysql

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

enter image description here

我现在需要能够将它显示为聊天中的头像,并带有以下代码

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

我想在此处显示包含在$ 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>

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

如果我在下面包含一个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 表格聊天

enter image description here

以下是我的查询,显示我如何获取ID和图片路径然后更新表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']."'");
    }
    }

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

enter image description here     

<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";
 }
?>

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

2 个答案:

答案 0 :(得分:0)

我知道这与你的方式有所不同,但它仍然会以更简单的方式提供相同的结果。

只要您拥有唯一的用户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');

等等。我通常做的是在外部页面中运行此功能,我总是包含在我的所有页面中。

希望这有帮助

答案 1 :(得分:0)

  

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

首先,您需要确定您不能在没有任务声明(计划)的情况下跳入编码。

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

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模块意味着你现在可以通过创建一个排名表并给每个等级的priveledges和一个独特的排名id(你和#)来调用你的成员/客户的权力39;当然需要代码。)

现在确定最佳的软件安全方法非常重要,这意味着要使用哪些连接驱动程序以及如何安全地使用每种驱动程序。在这个例子中,我将为您提供一个书面的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..

最后,检查上传类型很重要 - 任何用户都可以使用文件上传器轻松地将恶意脚本上传到您的服务器,除非您自己保护:这就是说,永远不要检查文件扩展名 - 您应该始终检查文件{{ 3}}

总而言之,安全性是软件的一个重要组成部分,防止它看起来很痛苦,但你以后会感谢我;)。

  

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