שיעורי PHP

ידע מוקדם נדרש: HTML, JS, לוגיקה
מהות הקורס: העלאה, שמירה והצגה של קבצים


מה זה בעצם PHP?

יש לנו בעיה...
אנחנו רוצים לאפשר בקובץ הhtml שלנו
מערכת תגובות ואפשרות למשתמשים להגיב באתר.
הבעיה שהאתר שלמדנו לבנות עד כה הוא סטטי ולא מושך או שומר נתונים!

לכן, פיתחו את שפת הPHP שנותנת מענה לבעיה זו.
השפה תומכת בתגיות הHTML השונות, הCSS, הJS והיא יכולה להציג את האתר כמו שהוא – רק עם תוספת אחת קטנה – אפשרות גם להעלות, למשוך ולשנות מידע באינטרנט.

בשיעורים הראשונים, כאן בעולם ההייטק, אלמד אתכם את יסודות השפה, סכמות הכתיבה שלה.
מי שכבר בנה אתר או שתיים והתנסה גם בjs, לא יהיה לו כל אתגר לכתוב בPHP בקלות.

עלינו להכיר מס' מושגים בסיסיים בעולם הPHP וכן גם תוכנות שעלינו להתקין...
המושגים משתייכים לעולם הSERVER והשרתים, על מנת להריץ PHP (בניגוד לHTML) עלינו להעלות את הקבצים שכתבנו לשרת ולשמור בו את כל המידע! במשך כל שיעור נעבור על FORM בנוי מראש. לטופס שלנו נצטרך להוסיף מס' תכונות קבועות:

<form action="index.php" method="get"/>
<input type="text" name="name"/>
<input type="submit"/>
הוספנו את התכונה method ונתנו לה get. ניתן גם לרשום post.
ההבדל בין השתיים הוא: get הוא אינו מאובטח ואנו רואים את הרשימה של מה ששמרנו והכל בשורת החיפוש. למשל: http://mag.co.il/web/stories/tgova1.php?name=TAL&txt=TEST

אחרי שווידאתם שאתם סגורים על: HTML , JS , לוגיקה ויש לכם שרת (בין אם לואקלי ובין אם באחסון באינטרנט) – אפשר להתחיל ללמוד PHP ולהריץ אותו...





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

כמה כללים בסיסיים בphp:

  • php מייצגת את כל הדיבור עם השרת בתוך הhtml שלנו. נוכל לייצג את קטעי הphp בתוך iframe או במקום כל האתר שלנו. למשל, גם הסיומת של המדריך הזה כאן היא php אבל עדיין מכילה תגיות html,css,js וכו'... כלומר - נוכל לכתוב בקובץ הphp שלנו בnotepad++ את כל התגיות html css ואת כל האתר שלנו במלואו או לחלופין לשים רק את קטע הphp בתוך iframe.
  • נקודה נוספת מדברת על משתנים. למדנו בשלב הלוגיקה כי אנו יכולים לשמור משתנים בתוך מעין "טבלאות" או "ספריות" בתוך הזיכרון של כל שפה. גם בphp הדבר אפשרי בדומה לjs. אם בJs רשמנו את המילה var ואת שם המשתנה כמו למשל: var num = 5; כאן בphp נצטרך לכתוב דולר לפי כל שם משתנה בדומה לjQuery. הכוונה היא שיצירה של משתנה בשם num המכיל את המספר 5 יופיע כך - $num = 5;
  • לאחר שהבנו כי ניתן לכתוב בphp כמו בhtml רגיל, כעת נבין איך ניתן לשלב אותו בדף. שימו לב, אין תגית <php> פותחת ו- <⁄php> אלא פשוט תוך כדי הbody נוכל לכתוב את קוד הphp שלנו. נכתוב זאת בדרך הבאה:

      <?php
      //כל הקוד
      ?>
  • ניתן לבצע פעולת print ("הדפסה") של פלטים מסוימים למסך שלנו. אם בjs זה יהיה בצורת alert או ישירות לטקסט כמו innerHTML , ואם בjava זה יהיה syso (System.out.println) כאן זה יהיה echo
  • במקרה זה הכוונה תהיה לכך שכל מה שנרשום לאחר מכן יופיע ישירות בתוך הדף שלנו כמעין פלט. הנה שני סוגים של echo:
    echo "TAL..."; - שיציג עבורינו את הכיתוב tal ללא תגית שעוטפת אותו.
    echo "<h1>TAL...<⁄h1>"; - שיציג תגית H1 מלאה עם כל העיצוב ושינויים בDOM. שימו לב ל"צפה במקור הדף".
  • עלינו לזכור כי על מנת להריץ את קטע הPHP שלנו במלואו, עלינו להתבסס על שרת כלשהו כמו למשל שרת שנקנה אחסון חודשי (אפילו בעלויות מאוד נמוכות) או אחסון חינמי. יש המון אתרים שנותנים שירותים כאלו.

  • עכשיו תורכם - נסו בעצמיכם לפתור את התרגילים הבאים ולהציגם דרך echo בDOM של הHTML:
    1) צרו משתנה הקולט את המספר 5. הציגו את המספר.
    2) צרו משתנה הקולט את המספר 10. הציגו את המספר כפול עצמו.
    3) צרו משתנה הקולט שני מספרים. 20 ו10. הציגו את 20 חלקי 10 (כלומר שבecho יהיה כתוב 10).
    4) צרו משתנה הקולט את המילה "מדריך" ומשתנה נוסף הקולט את המילה "PHP". הציגו בecho בתוך תגית H1 את הכיתוב "מדריך PHP" באמצעות המשתנים.
    5) הציגו בecho את המילה "TAL" בכל תגיות הH1-H6.




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

    עלינו להיעזר בבסיס/מסד נתונים. DATA BASE. מה זה בכלל?
    בסיס נתונים או מסד נתונים (באנגלית: Database, או בקיצור DB) הוא אמצעי המשמש לאחסון מסודר של נתונים במחשב, לשם אחזורם ועיבודם. בסיס נתונים מאוחסן באמצעי אחסון נתונים, המאפשר גישה ישירה לנתונים. הגישה לבסיס הנתונים נעשית באמצעות ממשק ייעודי. בסיס הנתונים בנוי לפי מודל לאחסון הנתונים, כמו מנגנונים פנימיים למיון ולחיפוש.

    מסד הנתונים בנוי מטבלאות. לכל טבלה יש שם, והיא מחולקת לטורים ושורות. כל טור מייצג מאפיין וכל שורה מייצגת פיסת מידע. קחו לדוגמא את הטבלא הבאה, אשר נקראת cats ומכילה מידע על צי החתולים שלנו (ממש בדומה לאובייקטים):

  • color
  • name
  • volume

  • כעת, נוכל פשוט להזין מידע לתוך inputs מהמשתמשים ולשמור את המידע במסד נתונים כלשהו. נצטרך לדעת את הקוד של השמירה במסד ואת השליפה מהמסד (על כך נלמד בשיעור הבא במדריך) אבל ראשית נסביר על הממשק ושפת המסד בה נשתמש בPHP והיא MYSQL.




    SQL (structured query language) היא שפה ייחודית היוצרת גישה למסדי נתונים. MySQL הוא מסד נתונים אליו ניתן ליצור גישה בעזרת שילוב בין השפות PHP ו- SQL.
    במדריך שלנו ובסרטוני עולם ההייטק תוכלו לדעת איך לשלב בין PHP ו- MySQL כדי ליצור אתר עם מסד נתונים.

    למי שעדיין לא מובן - מה ההבדל בין SQL לבין mySQL? התשובה פשוטה: SQL היא שפה המאפשרת גישה ומניפולציה למידע השמור במסדי נתונים. mySQL הוא מסד הנתונים אליו מתאפשרת הגישה בעזרת שאילתות בשפת SQL.


    איך מתחילים?
    צפו בסרטון בו טל עובר שלב אחרי שלב.
    שימו לב, אחרי שתרכשו אחסון כלשהו (אפילו זול מאוד) ינתן לכם שירות מאיש האחסון שלכם אודות ממשק הSQL הקיים בשרתכם. תוכלו ליצור טבלאות שונות, כמו בסרטון בדרך פשוטה בממשק של הוספה.

    שפת הכתיבה בMYSQL
    יש איזור מיוחד בתוך הממשק באיזור הטבלה שיצרתם עם המשתנים השונים, בתוכו תוכלו להזין פנימה ישירות קטעי קוד שונים ולדבר עם הטבלה שלכם. הכוונה היא, ניתן יהיה לבצע בדיקות על הטבלה כמו יצירה של תא חדש המלא במאפיינים חדשים שלא על ידי INPUTS של המשתמשים. אלא על ידכם. למשל, אם הייתה דוגמא מקודם של חתול אשר מקבל תכונות של צבע, שם ורמת וויליום אז פה מה שיהיה זה הוספה של חתול בצבע כתום, בשם ויסקי בעל ווליום 50. איך כותבים זאת בשדה הרלוונטי בMYSQL? כך:
    INSERT INTO `cats`(`color`, `name` , `volume`) VALUES (`oragne`,`whiskey`,`50`)




    ID
    בנוסף, ניתן גם ליצור שינויים או מחיקה של אלמנטים שונים
    איך עושים זאת? צריך להגדיר לכל תא ותא משתנה בשם ID שהוא מוגדר גם כauto increment (שימו לב כאשר אתם מגדירים משתנים שניתן לסמן את השדה הזה בcheckbox) וגם שהוא מפתח key. הכוונה היא - שהמשתנה הזה (מסוג INT) הוא משתנה שסופר את התאים כל הזמן.
    לאחר שביצענו גם את הפעולה הזו, ניתן כעת לשלוף איברים מתאים ספצפיים לפי הID שלהם. אם שכחתם ID ניתן גם לבצע שליפה על ידי פריט ספציפי כמו "תן לי את התא לפי השם 'WHISKEY' למשל... גם זה אפשרי. שימו לב לדוגמא בה ניתן למחוק תא לפי הID:


    DELETE FROM `cats` WHERE id=1
    UPDATE `cats` SET `name`=["tal"] WHERE id="1"


    קישור מהPHP שלנו לDATABASE שלי
    כאשר נרצה לקשר בין הdatabase שלנו בממשק שהביא לנו איש האחסון, לתוך קובץ הPHP שלנו, נוכל לעשות זאת בקלות על ידי קריאה לפונקציה הקיימת מראש.
    עלינו לקרוא לה על ידי כתיבה בתוך הphp של הקוד הבא: new mysqli(). כפי ששמתם לב יש סוגריים בקריאה לפונקציה הזו. היא צריכה לקבל 4 פרמטרים:
  • כתובת השרת - ניתנת על ידי איש האחסון. יכולה להיות למשל 0.555.232.11 כמו IP
  • שם המשתמש - ניתן גם הוא על ידי איש האחסון, זהו שם המשתמש דרכו אתם נכנסים לתוך ממשק הניהול של הMYSQL שלכם
  • סיסמא - ניתנת על ידי איש האחסון, הבנתם את הרעיון. הסיסמא זוהי אותה הסיסמא אשר אתם נכנסים איתה פנימה לתוך ממשק הניהול.
  • והפרמטר האחרון הינו - שם הdatabase. במקרה שבסרטון השם הוא mydb ושם הטבלה היא taltest. אתם צריכים להזין mydb. את שם הטבלה נזין מאוחר יותר, כבר בשיעור הבא.


  • ניתן לשדרג את קטע הקוד, בדומה לסרטון, בכך שנפריד בין כל הפרמטרים למשתנים (דולר בהתחלה) וכן גם נעשה בדיקת if פשוטה עם משתנה נוסף. במידה וכל הנתונים הוזנו כראוי ויש אישור תקין אז היכנס ובמידה ולא - הצג הודעת שגיאה. כך נראה הקוד בשלמתו:

      $servername = "54.443.11.03";
      $username = "user";
      $password = "pass";
      $dbname = "mydb";

      // Create connection
      $conn = new mysqli($servername, $username, $password, $dbname);

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

      //בשיעור הבא :-)

      }



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

    על מנת להעלות טקסט כלשהו, נצטרך ליצור גישה לטבלה שלנו שתכיל 2 פרמטרים לפחות. האחד יהיה id מסוג int והוא auto increment primary key אשר מכריז כי הid הוא המפתח שלנו, והשני יהיה text מסוג text.

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

    העלאה

    על מנת לבצע העלאה מתוך שדה input עלינו לודא שהוא עטוף בתוך הform שהכנתם מראש והform מקבל action של get או post לשיקולכם.
    לאחר מכן, עלינו לבצע רפרנס בתוך הphp אל התוכן של הinput שלנו, דרך משתנה חדש.
    מכאן, נותר רק לקרוא לשורה שלנו בsql, כפי שביצענו בשיעור הקודם, ולהכניס פנימה את הערך. הערך יקבל את מספר הid באופן אוטומטי ואין צורך להזין גם אותו. (כלומר, אם המיקום שלו הוא 6 אז הוא יקבל 6 אוטומטית, כי הגדרנו את הid כkey שלנו).

      $name = $_POST['name'];
      $txt = $_POST['txt'];
      $sql = "INSERT INTO php (name, txt)
      if ($conn->query($sql) === TRUE) {
      echo "<script>alert('ההודעה התווספה בהצלחה')</script>";
      } else {
      echo "<script>alert('ישנה שגיאה, אנא נסה שנית')</script>";
      }

    הצגה

    בפרק זה במדריך אסביר על הצגת פריט ספציפי (שורה אחת מהטבלה). על מנת לדעת כיצד להציג את כל הפריטים של הטבלה ולרוץ על כל שורותיה, גשו לפרק העוסק בהצגת כלל הפריטים עם לולאת while שרצה על כל הטבלה.

    כאשר נרצה לשלוף ולהציג פריט ספציפי, יהיה עלינו לדבר עם הid הרלוונטי. כלומר, נבחר את השורה הראשונה (id במקום ה1) בדוגמא הבאה וכך נציג את הטקסט במקום הרלוונטי דרך echo :

      $result = mysql_query("SELECT txt FROM `taltest` WHERE `id` = 1 ");
      $row = mysql_fetch_array($result);
      echo $row[$field];




    באותו רעיון כמו בהעלאת טקסט, נוכל להעלות תמונה.

    ראשית, עלינו לסמן בטבלת הsql שלנו את סוג התא שיהיה longtext.
    בנוסף, בform שלנו עלינו ליצור input נוסף עם type מסוג file. הדבר יגרום שבעת לחיצה על הinput תיפתח חלונית העלאת תמונה. העתיקו את הקוד הבא:

      <input type='file' name='file' />

    לאחר מכן, שהתעסקנו עם SQL והform בHTML, ניגש לPHP שלנו ונעלה את התמונה לSQL. עלינו לבצע התחברות לdata base ואז לכתוב את הקוד הבא, אשר לוקח את התמונה וממיר אותה לשפה בינארית של 0 ו1.
      $name = $_FILES['file']['name'];
      $txt = $_POST['txt'];
      $target_dir = "upload/";
      $target_file = $target_dir . basename($_FILES["file"]["name"]);

      // Select file type
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

      // Valid file extensions
      $extensions_arr = array("jpg","jpeg","png","gif");

      // Check extension
      if( in_array($imageFileType,$extensions_arr) ){

      // Convert to base64
      $image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
      $image = 'data:image/'.$imageFileType.';base64,'.$image_base64;

      // Insert record
      $query = "insert into blog(name,image,txt) values('".$name."','".$image."','".$txt."')";

      mysqli_query($con,$query) or die(mysqli_error($con));

      // Upload file
      move_uploaded_file($_FILES['file']['tmp_name'],'upload/'.$name);
      }




    בריצה על כל שורות הטבלה במסד הנתונים, נשלוף רק את הערך של התמונה ונציג אותה בצורה מסודרת דרך src בתגית הimg:
      while (mysql_fetch_array($mq)){
      $s= mysql_fetch_array($mq)['image'];
      echo '<img src="'.$s.'" style="width:128px;height:128px">';
      }






    על מנת לרוץ על כל הטבלה, נצטרך להשתמש בלולאת while אשר תרוץ על כל תא, תייצר משתנה שיקלוט את הערך הרלוונטי מהתא ולבסוף נציג דרך echo. התנאי ללולאה יהיה שאילתא האם יש תא נוסף או לא? במידה והשאלה תחזיר true, סימן שיש תא נוסף וניכנס ללולאה. במידה ויחזור false אז פשוט יצא מהלולאה. (ראה ערך: לולאות במדריך לוגיקה).

      $sql = "SELECT id, txt FROM blog";
      $result = $conn->query($sql);
      if ($result->num_rows > 0) {
      while($row = $result->fetch_assoc()) {
      echo "<div class='comments' dir='rtl' style='background-color:lightblue; border-radius:5px; width:75%; margin:5px; color:black'><b>". $row["name"]. "</b> : " . $row["txt"] . "</div>"; }
      } else {
      echo "";
      }




    למעשה נוכל לערוך ולמחוק תאים ספציפיים וזאת דרך בחירה של אלמנט ספציפי.
    כלומר, נצטרך להגיד תן לי את האלמנט בתא ה5 ושנה לו את הNAME למשהו אחר...
    נוכל לגשת לכלי העריכה בsql שלנו -


    לאחר שוידאנו שיש לכל תא ID (ראה פרק 3 "SQL" במדריך) ווידאנו שאנו בתוך הכלי לעריכה/מחיקה - ניתן כעת לשלוף איברים מתאים ספצפיים לפי הID שלהם. אם שכחתם ID ניתן גם לבצע שליפה על ידי פריט ספציפי כמו "תן לי את התא לפי השם 'WHISKEY' למשל... גם זה אפשרי. שימו לב לדוגמא בה ניתן למחוק תא לפי הID:

      DELETE FROM `cats` WHERE id=1
      UPDATE `cats` SET `name`=["tal"] WHERE id="1"






    שימו לב - יש מקרים בהם ניתן לכתוב בתוך הinput קטעי קוד והSQL יתייחס אליהם כאל קודים לכל דבר ועניין. למשל, נסו לכתוב בתוך הinput שבform שלכם את הכיתוב <script>alert("test...");</script> לאחר מכן, ליחצו על העלאה לPHP.

    לצערינו, מעכשיו איך שניכנס לדף הPHP שלנו תוקפץ הודעת ALERT כזו עם הכיתוב test.
    הדבר עלול לגרום לבעיות קשות, שהרי ניתן בדומה לALERT לבצע קטעי קוד בJS שיגרמו להאקרים להשתלט לכם על האתר.. למשל, קטע קוד שנכתוב בinput שגורם ליציאה אוטומטית מהדף שלכם, איך שנכנסתם אליו. או - להעביר את האתר בדפדפן מהאתר שלכם לאתר שלו...

    לכן, יש מספר דרכי הגנה שאדבר עליהם כאן:

  • בדיקות לוגיות שונות - דרך if פשוט נוכל לבדוק האם התווים שהוכנסו לתוך הinput לא מכילים איזשהו תו כמו < למשל... או את אחת התגיות/הפקודות כמו script, img, onload, alert ועוד שנוכל דרכן לגרום לקריסה, באגים או שגיאות. בקיצור, עלינו לודא שזה רק תווים. נעשה זאת דרך מתודה בPHP שכתובה מראש :
      if (!preg_match('/[^A-Za-z0-9]/', $string))
      {
      // string contains only english letters & digits
      }
  • המרת הטקסט בinput לstring - הכוונה היא, לא משנה מה כתבו שם אפילו תגיות או מילים שמורות בjs , להמיר אוטומטית לטקסט רגיל והתעלמות מוחלטת מהמרה לHTML. זאת באמצעות המתודה htmlspecialchars שגם היא מתנת הPHP:
      $name = $_POST['name'];
      $name_perfect = htmlspecialchars($name);




  • מערכת תגובות

    בני : תודה לך
    גיא : מחכה למדריך הבא
    אלון : אחלה

    שם:
    ההודעה:
    🔝