אני בתהליכים של בניית פורום ואני רוצה את דעתכם - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

אני בתהליכים של בניית פורום ואני רוצה את דעתכם


Daniel Fogel

Recommended Posts

שלום אני מתכנת php מתחיל והחלטתי לקחת על עצמי פרוייקט ולהקים פורום מאפס בנתיים בניתי מסד נתונים קטן וכמה דפים ב php html אפשר בפורום בנתיים להירשם לפורום לעשות כניסה ליצור הודעה חדשה בפורום וכול ארבע הודעות הוא פותח דף חדש להודעה אחרונה וככה אלה למשל a b c d e f g h i j אז יהיו 4 דפים שבדף אחרון יש רק הודעה אחת שהיא a

וגם אפשר להיכנס להודעות ולהגיב עליהם לערוך כול הודעה שהגבת ושייכת לך או למחוק אותה וגם אני בהתחלה של שליחת הודעות בין משתמשים באתר בנתיים מצליח לי עד כו אני מצרף פה את הקוד של המסד נתונים ולדוגמא את הקוד של הphp בדף שמגיבים על הודעות ויוצרים הודעות אני רוצה לציין כול המשתנים שלי נתתי להם כול מיני שמות מוזרים וגם לא השתמשתי כמעט בפונקציות כול הקוד מסורבל אבל הוא עובד מצויין ! אז מה דעתכם?הבעיה שיש לי קצת ידע ואין לי מושג איך בונים פורום הכול כאן מאולתר מאפס בנתיים אני מצליח לשלב את php עם mysql שזה יעבוד אבל אני בטוח שאפשר לשפר מלאה וככה לא באמת מתכנתים פורום ואיזה עוד פרוייקטים אתם ממליצים לי עוד לנסות לעשות כדי להשתפר ולהבין את השפה?ומסדי הנתונים.

זה המסד נתונים והקוד שמגיבים על הודעות



create database middlenews;use middlenews;create table users(user_id int NOT NULL auto_increment ,user_name varchar(30),first_name varchar(30),last_name varchar(30),email varchar(30),password1 varchar(30),primary key(user_id));create table forum(forum_id int,forum_name varchar(30),primary key(forum_id));create table comments(comment_id int not null auto_increment,forum_id int,user_id int,head_comment varchar(30),comment varchar(100),times varchar(40),primary key(comment_id));create table pages(page_id int not null auto_increment ,comment_id int,primary key(page_id));create table tguva(tguva_id int not null auto_increment,comment_id int,user_id int,tguva1 varchar (30),times1 varchar(30),primary key(tguva_id));create table mailbox(mail_id int auto_increment,user_id int,user_name varchar(30),messager varchar(30),toh varchar(30),timer varchar(30),
primary key(mail_id));create table mailtalk(talk_id int auto_increment,mail_id int,user_id int,talk_comment varchar(30),timer1 varchar(30),primary key(talk_id));ALTER TABLE commentsADD CONSTRAINT FK_user_idFOREIGN KEY (user_id) REFERENCES users(user_id),add constraint FK_forum_idforeign key(forum_id)references forum(forum_id);insert into forum(forum_id,forum_name)values(1,'Middle East');insert into forum(forum_id,forum_name)values(2,'Public');
ALTER TABLE tguvaADD CONSTRAINT FK_comment_idFOREIGN KEY (comment_id) REFERENCES comments(comment_id),ADD CONSTRAINT FK_user_id1FOREIGN KEY (user_id) REFERENCES users(user_id);ALTER TABLE mailboxADD CONSTRAINT FK_uszFOREIGN KEY (user_id) REFERENCES users(user_id);alter table mailtalkadd constraint fk_usforeign key (user_id)references users(user_id),add constraint fk_mailforeign key (mail_id)references mailbox(mail_id)

<?php
$servername = "localhost";
$username = "root";
$password = "dsad1234";
$dbname = "middlenews";
// Create connection
$conn = new mysqli($servername, $username, $password,$dbname);

// Check
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

session_start();
date_default_timezone_set('Israel/Jerusalem');
$time = date('m/d/Y h:i', time());
$user=$_SESSION['id'];
$id = $_GET['id'];
$name12 ="select user_name from users where user_id='$user'";
$ft11=$conn->query($name12);
$comment='';
while($row=$ft11->fetch_assoc())
{
$user1 = $row['user_name'];
}
if(isset($_POST['sub']))
{
$title = $_POST['tit'];
$msg = $_POST['msg'];
$comment1 = "insert into tguva(comment_id,tguva1,user_id,times1) values('$id','$msg','$user','$time')";
$conn->query($comment1);
}
$f = "select user_name,comment,times from comments,users where comment_id='$id' and comments.user_id = users.user_id";
$fl=$conn->query($f);
if($fl->num_rows>0)
{
while($row=$fl->fetch_assoc())
{
$tg=$row['user_name'];
$tg1=$row['comment'];
$tg2=$row['times'];

}
$comment=$comment."<div id='boxer2'>
<div id='blue'>
<div id='date'>$tg2</div>
<div id='name'>By $tg</div>
</div>
<br>
<div id='msg''>
$tg1
</div> </div> ";
}
$tguva = "select user_name,tguva1,times1,tguva_id from tguva,comments,users where tguva.comment_id='$id'
and tguva.comment_id=comments.comment_id and tguva.user_id = users.user_id";
$small = $conn->query($tguva);
if($small->num_rows>0)
{
while($row=$small->fetch_assoc())
{
$tid = $row['tguva_id'];
$us = $row['user_name'];
$tguva1= $row['tguva1'];
$time1=$row['times1'];
$comment = $comment."<div id='boxer'>
<div id='blue'>
<div id='date'>$time1</div>
<div id='name'>$us</div>
</div>
<br>
<div id='msg'>
$tguva1
</div>
<div id='edit'>
<a href='edit.php?id=$tid'>Edit Message</a>
</div>
<div id='delete'>
<a href='delete.php?id=$tid'>Delete Message</a>
</div>
</div> ";

}
}





?>



- - - תגובה אוחדה: - - -

זה הדף שיוצרים הודעה בפורום


<?php
$servername = "localhost";
$username = "root";
$password = "***";
$dbname = "middlenews";
// Create connection
$conn = new mysqli($servername, $username, $password,$dbname);

// Check
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

session_start();
$page = $_GET['id'];
$kts = FALSE;
$userid = $_SESSION['id'];
date_default_timezone_set('Israel');
$time = date('m/d/Y h:i', time());
if(isset($_POST['sub']))
{
$title = $_POST['tit'];
$msg = $_POST['msg'];
$comment = "insert into comments(forum_id,user_id,head_comment,comment,times) values(1,'$userid','$title','$msg','$time')";
$conn->query($comment);



}
$ft = $_SESSION['id'];
$name ="select user_name from users where user_id='$ft'";
$ft1=$conn->query($name);
while($row=$ft1->fetch_assoc())
{
$user = $row['user_name'];
}

$fk = "select user_name,comment_id, head_comment,times from comments,users where comments.user_id = users.user_id order by comment_id DESC";
$ts = $conn->query($fk);
$sum=0;
$tgk=FALSE;
$sum1=0;
$page1 = $page*3;
$ftr='';
$page = $page *3;
$page1 =$page1-3;
$pages =0;
$pages1=0;
$yesh=0;
$ftp = 0;
$ps=0;
$sumer=0;
$rows1=$ts->num_rows;
for($kj=0;$kj<=$rows1;$kj++)
{

$ps=$ps+3;
if($ps>$rows1)
{
$ftp = 1;
}
if($ps==$rows1)
{
$kj=$kj*$rows1+100;
}
}
if($ts->num_rows>0)
{

while($row=$ts->fetch_assoc())
{
$pages=$pages+1;
if($pages==3)
{
if($ftp>0)
{
$ftp= 0;
$pages1=$pages1+1;
$pages2 = $pages2."<a href='talk.php?id=$pages1'>$pages1</a>";
}
$pages1=$pages1+1;

$pages2 = $pages2."<a href='talk.php?id=$pages1'>$pages1</a>";
$pages=0;



}

$sum=$sum+1;
if($sum>$page1 && $sum<=$page)
{
$sum1=$sum1+1;
$us = $row['user_name'];
$kr = $row['comment_id'];
$lt =$row['head_comment'];
$tim = $row['times'];
$ftr=$ftr."<div id='boxer'>
<div id='blue'>
<div id='date'>$tim</div>
<div id='name'>By $us</div>
</div>
<br>
<div id='msg''>
<a href='message.php?id=$kr'>$lt</a>
</div> </div> ";

if($sum1==3)
{
$kts = TRUE;
}
}
if($kts==true)
{
$sum=-5;
}
$us = $row['user_name'];
$kr = $row['comment_id'];
$lt =$row['head_comment'];
$tim = $row['times'];
}
}

?>

קישור לתוכן
שתף באתרים אחרים

כמה סימני פיסוק, ירידות שורה והפרדה לפסקאות בהודעה שלך זה יהיה התחלה טובה.

אם אפשר גם בבקשה בלי code dumps. אי אפשר להבין מדבר כזה כלום. אם יש לך שאלה ספציפית על קטע קוד כלשהו לך על זה, אבל לזרוק את כל הקוד שלך לעמוד ולשאול איך זה - זה קצת בעייתי.

ויש לי עוד 2 מילים בשביל - mysql injection. תשתמש ב- prepared statements כדי למנוע את זה.

קישור לתוכן
שתף באתרים אחרים

כן תודה בקשר לsql injection אני עדין לא הגעתי לשלב של אני רק לומד לבנות את המערכת עכשיו יש לי שאלה קטנה בקש לטבלה של הודעות בין מישתמשים כמו מייל כזה בתוך אתר. אז יש לי

table mails

mail id primary key

,user id foreign key

,user_name

,head message

,message

טבלה שנייה יש לי

chat id primary key

user_id foreign key

mail id foreing key

message

עכשיו השאלה שלי בטבלה הראשונה אני מכניס user_id לפי מי ששולח ובuser_name אני רושם מי שמקבל את המייל לא הבנתי איך אני יכול להכניס שתי user_id לטבלה אחת אז עשיתי עמודה אחת של user_id ואחת של user_name בתגובות במיילים זה כבר לא בעיה אני משתמש רק בuser_id כי כול תגובה יש רק בן אדם אחת והיא נמצאת כבר בתוך mail_id ככה שיש לי כבר את שניהם. אבל משום מה נראה לי שאני לא עושה כמו שצריך וזה כבר מתחיל להיות אילתור רע. מה הייתה ממליץ לי לעשות?ואיפה אפשר להשיג מדריכים ברמה גבוה שמלמדים SQL

חשבתי גם לעשות את user_id and mail_id primary key ואז פשוט זה יצור פעמים רק שאסור אותו שם פעמיים כאילו אפשר אותו מייל אידי אבל אז אני מסתבך עם sql auto_increment

קישור לתוכן
שתף באתרים אחרים

אין בעיה להוסיף כמה IDים בטבלה. ID הוא מספר ולכן השדה שאתה תרצה להוסיף הוא integer. אתה פשוט צריך לקרוא לו בשם שונה ולהתייחס אליו על פי השם הזה. כמובן יש להוסיף index מתאים לשדות שמשמשים כ- foreign key.

אני לא מומחה מסדי נתונים (ואני בטוח שיש מישהו בפורום שיכול לתת לי 100 סיבות למה כל אחת מהאפשרויות שציינתי פה לא טובה ;) ), אבל בשביל משהו בסיסי הייתי הולך על משהו כזה:

qvKyHds.png

או משהו כזה:

VCHMIhl.png

כמובן כמה דברים חשובים:

* indexes. תדאג להוסיף אינדסים לשדות שעל פיהם אתה תבצע שליפה ממסד הנתונים

* password. לעולם אבל לעולם אל תשמור סיסמאות כטקסט רגיל. אתה רוצה לשמור hash של הסיסמה (hashed + salted עוד יותר טוב) ולהשוות את ה- hash של הסיסמה שהמשתמש מזין בהתחברות לזה ששמור במסד נתונים. תשתמש בפונקציות password_hash ו- password_verify של PHP

* וכמו שציינתי קודם, לעולם אבל לעולם אל תסמוך על הקלט שאתה מקבל מהמשתמש. תתחיל לעבוד מראש עם prepared statements ותחסוך כאב ראש בעתיד כשתנסה ללמוד "להמיר" את עצמך לעבודה עם זה.

לגבי מדריכים תבדוק אולי את teamtreehouse. בתשלום אבל ממה שיצא לי לראות בד"כ יש להם הדרכות טובות (יש trial ל- 14 יום)

http://teamtreehouse.com/library/using-php-with-mysql

ובכל מקרה תמנע מ- w3schools. הם מסבירים על עבודה עם פונקציות mysql_* רגילות בלבד. שלא לדבר על זה שהפונקציות הללו כבר מוגדרות deprecated, הן גם לא בטוחות לשימוש רגיל.

קישור לתוכן
שתף באתרים אחרים

תותח עכשיו בדקתי וזה עובד לימדתת אותי שתי דברים חדשים :) שמפתח זר לא חייב להיות בשם של המפתח בטבלה הראשית שלו ואיך אפשר להשתמש בו פעמיים בו זמנית בטבלה שהוא מפתח זר בא

כי עד עכשיו השתמשתי במפתח זר עם אותו השם פעמיים באותו טבלה וזה לא עבד לי עכשיו שהבנתי שאפשר לשנות את השם שלו אני יכול להשתמש בו פעמיים

תודה רבה !!! זה עזר לי המון

table mail

{

mail id primary_key

to_mail foreignkey(user_id)

from_mail foreigkey(user_id)

date () time

head varchar

comment varchar

}

table mailchat

(

chat_id primary_key

mail_id foreign key

user_id forein key (user_id)

date time

comment varchar

)

זה מספיק למערכת שתציג באיזה שעה נשלחה הודעה ועל ידי איזה משתמש וגם שיהיה אפשר להתכתב בתוך הודעה ולראות על ידי מי ובאיזה שעה ? עם הבנתי נכון

קישור לתוכן
שתף באתרים אחרים

select user_name,comment,time,chat_id from chat,mail,users where chat.mail_id='$id'

and chat.mail_id=mail.mail_id and chat.user_id = users.user_id"; דרך הגב מה אתה אומר על השאילתה הזאת כדי לשלוף את התכתבויות בין המשתמשים?יש דרך יותר נכונה?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...