PHPを使用してチャットアプリケーション
すべてのプログラマは、彼の人生で一度チャットアプリケーションを作りたい、彼/彼女は使用している可能性のある技術のスタックになります.単純なチャットアプリケーションを作ることは困難ではない初心者のための少しトリッキーです.今ではPHPをなぜ使うのでしょうか?あなたが初心者ならば、あなたはいつもこのようなトリッキーなアプリケーションを作るためにPHPのようなスクリプト言語を選択する必要があります.
したがって、そのようなアプリケーションを作る方法を始める前に、xamppやwampserverのようなサーバが必要です.これはPHPでコーディングしているときに動作するローカル環境を作成するのに役立ちます.XAMPPサーバをセットアップして、アプリケーションのフォルダを作成したら、私のアプリケーション「wassup」という名前になります.
まず最初に、我々のAPIがあるつもりであるページが何であるかについて考えましょう.今のところ、我々はログインページ、登録ページ、ダッシュボードページ、検索結果ページとメッセージページを作るつもりです.
以下はこのプロジェクトのSQLダンプです.
また、このプロジェクトのデータベースを設定する必要があります.
うーん!今日はあまりにも多くのコードだった.以下はこのプロジェクトのGithub Repoです.
これはコアPHPを使用してチャットAPIです.このAPIは、登録されているユーザーにメッセージを送信するために使用することができます.
このプロジェクトで始めるには、いくつかの基本的なgitコマンドを使います. Gitクローン git add git commit - M "コミットメッセージがここにある" Gitプッシュ
wassupをインポートします.ローカルのphpMyAdminコンソールにSQLファイルを送り、このプロジェクトの作業を開始します.
View on GitHub
閉じるこの動画はお気に入りから削除されています.あなたがしたならば、コメント部で私に話してください.
ローカルシステムでのサーバーの設定
したがって、そのようなアプリケーションを作る方法を始める前に、xamppやwampserverのようなサーバが必要です.これはPHPでコーディングしているときに動作するローカル環境を作成するのに役立ちます.XAMPPサーバをセットアップして、アプリケーションのフォルダを作成したら、私のアプリケーション「wassup」という名前になります.
コードしましょう!
まず最初に、我々のAPIがあるつもりであるページが何であるかについて考えましょう.今のところ、我々はログインページ、登録ページ、ダッシュボードページ、検索結果ページとメッセージページを作るつもりです.
以下はこのプロジェクトのSQLダンプです.
-- phpMyAdmin SQL Dump
-- version 5.0.2
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Sep 20, 2020 at 11:58 PM
-- Server version: 10.4.11-MariaDB
-- PHP Version: 7.3.18
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `wassup`
--
-- --------------------------------------------------------
--
-- Table structure for table `messages`
--
CREATE TABLE `messages` (
`id` int(100) NOT NULL,
`sent_by` varchar(255) CHARACTER SET latin1 NOT NULL,
`received_by` varchar(255) CHARACTER SET latin1 NOT NULL,
`message` varchar(255) CHARACTER SET latin1 NOT NULL,
`createdAt` varchar(255) CHARACTER SET latin1 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE `users` (
`id` int(100) NOT NULL,
`name` varchar(255) CHARACTER SET latin1 NOT NULL,
`email` varchar(255) CHARACTER SET latin1 NOT NULL,
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
`dp` varchar(255) CHARACTER SET latin1 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `messages`
--
ALTER TABLE `messages`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `messages`
--
ALTER TABLE `messages`
MODIFY `id` int(100) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
MODIFY `id` int(100) NOT NULL AUTO_INCREMENT;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
このプロジェクトのファイル構造は以下の通りです.また、このプロジェクトのデータベースを設定する必要があります.
<?php
// connection to DB
$conn = mysqli_connect("localhost","root","","wassup") or die(mysqli_error($conn));
?>
登録ページでは、新しいユーザーを登録するつもりです、そして、彼/彼女がデータベースにすでに存在するならば、我々は彼らにアカウントが存在するメッセージを伝えそうです.登録ページのバックエンドコードです.<?php
// session start
session_start();
// include DB connection
include('./db.php');
// declaring variables
$name = "";
$email = "";
$password = "";
$cpassword = "";
// get form data
if(isset($_POST['name'])) {
$name = $_POST['name'];
}
if(isset($_POST['email'])) {
$email = $_POST['email'];
}
if(isset($_POST['password'])) {
$password = $_POST['password'];
}
if(isset($_POST['password'])) {
$cpassword = $_POST['password'];
}
// setting up the target directory where you want to upload your images!
$target_dir = "../dp/";
$target_file = $target_dir . basename($_FILES["dp"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["dp"]["tmp_name"]);
if($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
}
// Check if file already exists
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// Check file size
if ($_FILES["dp"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["dp"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["dp"]["name"]). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
if($name != "" && $email != "" && $password != "" && $cpassword != "") { // if the form fields are not empty!
$checkUser = "SELECT * FROM users WHERE email = '$email'";
$checkUserStatus = mysqli_query($conn,$checkUser) or die(mysqli_error($conn));
if(mysqli_num_rows($checkUserStatus) > 0) { // if user exists!
header('Location: ../index.php?message=You have already registered!');
} else {
if($password == $cpassword) { // if the password fields match!
$image = basename($_FILES["dp"]["name"]);
$insertUser = "INSERT INTO users(name,email,password,dp) VALUES('$name','$email','$password','$image')";
$insertUserStatus = mysqli_query($conn,$insertUser) or die(mysqli_error($conn));
if($insertUserStatus) { // if the user is successfully registered!
header('Location: ../index.php?message=You have registered successfully!');
} else { // if user is not registered successfully!
header('Location: ../register.php?message=Unable to register!');
}
} else { // if password fields dont match!
header('Location: ../register.php?message=Password fields do not match!');
}
}
} else { // if any of the fields are empty!
header('Location: ../register.php?message=Please fill the fields properly!');
}
?>
ログインページについては、次のようになります.<?php
// session start
session_start();
// include DB connection
include('./db.php');
// declaring variables
$email = "";
$password = "";
// getting form data!
if(isset($_POST['email'])) {
$email = mysqli_real_escape_string($conn,strip_tags($_POST['email']));
}
if(isset($_POST['password'])) {
$password = mysqli_real_escape_string($conn,strip_tags($_POST['password']));
}
if($email != "" && $password != "") { // if the fields are not empty!
$checkUser = "SELECT * FROM `users` WHERE BINARY `email` = '$email' AND BINARY `password` = '$password'";
$checkUserStatus = mysqli_query($conn,$checkUser) or die(mysqli_error($conn));
if(mysqli_num_rows($checkUserStatus) > 0) { // if user exists!
header('Location: ../chats.php?message=You have logged in!');
} else {
header('Location: ../index.php?message=Unable to login into your account!');
}
} else { // if the fields are empty!
header('Location: ../index.php?message=Please fill all the fields!');
}
$_SESSION['email'] = $email;
?>
ユーザーが自分のアカウントにログインすると、ユーザーはダッシュボードページにリダイレクトされ、ユーザーが以前のすべての会話を見ることができます.また、このページには、自分のメールまたは名前を使用して特定のユーザーを検索する検索バーがあります.ダッシュボードページのコード:<?php
// session start
session_start();
// include DB connection
include('scripts/db.php');
if(!isset($_SESSION['email'])) { // if user not logged in!
header('Location: ./index.php');
} else {
$email = $_SESSION['email'];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Wassup</title>
<!-- external stylesheets -->
<link rel="stylesheet" href="assets/css/chats.css">
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Wassup</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item active">
<a class="nav-link" href="./chats.php">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./logout.php">Logout</a>
</li>
<?php
$getUser = "SELECT * FROM users WHERE email = '$email'";
$getUserStatus = mysqli_query($conn,$getUser) or die(mysqli_error($conn));
$getUserRow = mysqli_fetch_assoc($getUserStatus);
?>
<li class = "nav-item">
<img src="./dp/<?=$getUserRow['dp']?>" alt="Profile image" width = "40" class = "dropdown"/>
</li>
</div>
</nav>
<!-- chats section -->
<div class="container mt-4">
<div class="card">
<div class="card-title text-center">
<form class="form-inline mt-4" style = "display : inline-block" method = "POST" action = "scripts/search-users.php">
<input class="form-control mr-sm-2" type="search" name = "search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
<div class="card-body mb-4">
<?php
$lastMessage = "SELECT DISTINCT sent_by FROM messages WHERE received_by = '$email'";
$lastMessageStatus = mysqli_query($conn,$lastMessage) or die(mysqli_error($conn));
if(mysqli_num_rows($lastMessageStatus) > 0) {
while($lastMessageRow = mysqli_fetch_assoc($lastMessageStatus)) {
$sent_by = $lastMessageRow['sent_by'];
$getSender = "SELECT * FROM users WHERE email = '$sent_by'";
$getSenderStatus = mysqli_query($conn,$getSender) or die(mysqli_error($conn));
$getSenderRow = mysqli_fetch_assoc($getSenderStatus);
?>
<div class="card">
<div class="card-body">
<h6><strong><img src = "./dp/<?=$getSenderRow['dp']?>" alt = "dp" width = "40"/> <?=$lastMessageRow['sent_by'];?></strong><a href="./message.php?receiver=<?=$sent_by?>" class="btn btn-outline-primary" style = "float:right">Send message</a></h6>
</div>
</div><br/>
<?php
}
} else {
?>
<div class="card-body text-center">
<h6><strong>No conversations yet!</strong></h6>
</div>
<?php
}
?>
</div>
</div>
</div>
<!-- Bootstrap scripts -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
</body>
</html>
ユーザーが受信機の右側に配置されたSENDメッセージオプションをクリックすると、ユーザはメッセージボックスにリダイレクトされます.ユーザーがSend Messageオプションをクリックすると、受信者の電子メールIDがURLへのリクエストとして送信され、受信機の詳細を取得するために使用することができます.送信側と受信側の間のチャットボックスのコードは次のようになります.<?php
// session start
session_start();
// include DB connection
include('scripts/db.php');
error_reporting(0);
if(!isset($_SESSION['email'])) { // if user not logged in!
header('Location: ./index.php');
} else {
$email = $_SESSION['email'];
}
$receiver = $_GET['receiver'];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Wassup</title>
<!-- external stylesheets -->
<link rel="stylesheet" href="assets/css/chats.css">
<link rel="stylesheet" href="assets/css/message.css">
<!-- Fontawesome CDN -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" />
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Wassup</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item active">
<a class="nav-link" href="./chats.php">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./logout.php">Logout</a>
</li>
<?php
$getUser = "SELECT * FROM users WHERE email = '$email'";
$getUserStatus = mysqli_query($conn,$getUser) or die(mysqli_error($conn));
$getUserRow = mysqli_fetch_assoc($getUserStatus);
?>
<li class = "nav-item">
<img src="./dp/<?=$getUserRow['dp']?>" alt="Profile image" width = "40" class = "dropdown"/>
</li>
</div>
</nav>
<div class="container">
<?php
$getReceiver = "SELECT * FROM users WHERE email = '$receiver'";
$getReceiverStatus = mysqli_query($conn,$getReceiver) or die(mysqli_error($conn));
$getReceiverRow = mysqli_fetch_assoc($getReceiverStatus);
$received_by = $getReceiverRow['email'];
?>
<div class="card mt-4">
<div class="card-header">
<h6><img src="./dp/<?=$getReceiverRow['dp']?>" alt="Profile image" width = "40"/><strong> <?=$receiver?></strong></h6>
</div>
<?php
$getMessage = "SELECT * FROM messages WHERE sent_by = '$receiver' AND received_by = '$email' OR sent_by = '$email' AND received_by = '$receiver' ORDER BY createdAt asc";
$getMessageStatus = mysqli_query($conn,$getMessage) or die(mysqli_error($conn));
if(mysqli_num_rows($getMessageStatus) > 0) {
while($getMessageRow = mysqli_fetch_assoc($getMessageStatus)) {
$message_id = $getMessageRow['id'];
?>
<div class="card-body">
<h6 style = "color: #007bff"><?=$getMessageRow['sent_by']?></h6>
<div class="message-box ml-4">
<p class="text-center"><?=$getMessageRow['message']?></p>
</div>
</div>
<?php
}
} else {
?>
<div class="card-body">
<p class = "text-muted">No messages yet! Say 'Hi'</p>
</div>
<?php
}
?>
<div class="card-footer text-center">
<form action="scripts/send.php" method = "POST" style = "display: inline-block">
<input type="hidden" name = "sent_by" value = "<?=$email?>"/>
<input type="hidden" name = "received_by" value = "<?=$receiver?>"/>
<div class="row">
<div class="col-md-10">
<div class="form-group">
<input type="text" name = "message" id = "message" class="form-control" placeholder = "Type your message here" required/>
</div>
</div>
<div class="col-md-2">
<button type = "submit" class="btn btn-primary">Send</button>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- Bootstrap scripts -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
</body>
</html>
送付者がメッセージを送るとき、そして、バックエンドでは、送付者とレシーバーの詳細をフェッチする過程があります、そして、また、メッセージと日付と時間がメッセージを送って、データベースにこのデータを入力します.我々が日付と時間をここで使用している理由は昇順でメッセージを手配することです、さもなければ、メッセージは飛び上がっているように見えます.チャットボックスからメッセージを送信するコードは以下の通りです.<?php
// session start
session_start();
// include db connection
include('./db.php');
// declaring variables
$sent_by = "";
$received_by = "";
$message = "";
$createdAt = date("Y-m-d h:i:sa");
// get data from form
if(isset($_POST['sent_by'])) {
$sent_by = $_POST['sent_by'];
}
if(isset($_POST['received_by'])) {
$received_by = $_POST['received_by'];
}
if(isset($_POST['message'])) {
$message = $_POST['message'];
}
if($message != "") { // if message box is not empty!
// send message
$sendMessage = "INSERT INTO messages(sent_by,received_by,message,createdAt) VALUES('$sent_by','$received_by','$message','$createdAt')";
$sendMessageStatus = mysqli_query($conn,$sendMessage) or die(mysqli_error($conn));
if($sendMessageStatus) {
header("Location: ../message.php?receiver=$received_by");
} else {
header("Location: ../message.php?receiver=$received_by");
}
}
?>
私が作成したチャットAPIのデモビデオはこちらうーん!今日はあまりにも多くのコードだった.以下はこのプロジェクトのGithub Repoです.
プルシュモハンティ / チャットAPI
これは、コアアプリケーションを使用してチャットアプリケーションです
このプロジェクトについて
これはコアPHPを使用してチャットAPIです.このAPIは、登録されているユーザーにメッセージを送信するために使用することができます.
ハウツーとスタイル
このプロジェクトで始めるには、いくつかの基本的なgitコマンドを使います.
データベースの設定
wassupをインポートします.ローカルのphpMyAdminコンソールにSQLファイルを送り、このプロジェクトの作業を開始します.
View on GitHub
閉じるこの動画はお気に入りから削除されています.あなたがしたならば、コメント部で私に話してください.
Reference
この問題について(PHPを使用してチャットアプリケーション), 我々は、より多くの情報をここで見つけました https://dev.to/spectrumcetb/chat-application-using-php-20haテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol