אתה נמצא כאן יסודות השפה  >>  שימוש ב-MySQL  >>  טיפול בתוצאות שאילתא

טיפול בתוצאות שאילתא

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

<?php
  $result=mysql_query("SELECT id,name FROM players WHERE age>=18");
/*השאילתא בוחרת את העמודות
id ו-name מהטבלה players היכן
שהגיל גדול או שווה ל-18.
תוצאת השאילתא נשמרת ב-$result.
*/

  if (!$result)
/*במקרה של שאילתא לא חוקית,
הפונקציה תחזיר לנו ערך שקר.
*/

     echo "ERROR: error occured in MySQL query.";
  else //if the query was ok...
  
{
     while ($row=mysql_fetch_array($result))
/*באמצעות לולאת while עוברים על
כל שורות התוצאה מהשאילתא.
בכל איטרציה $row מקבל מערך
המספק מידע על השורה הבאה.
הפונקציה עובדת רק על תוצאות
של שאילתות SELECT.
*/

        echo
/*מדפיס את שמותיהם ומספרי הזיהוי
של כל השחקנים (טבלה players)
שיכולים לשחק בליגת הבוגרים.
*/
 $row['name']
/*מחזיר את הערך בעמודה name
מתוך השורה הנוכחית של התוצאה.
*/
." (".$row['id']
/*מחזיר את הערך בעמודה id
מתוך השורה הנוכחית של התוצאה.
*/
.") is over 18.<BR>\n";
  }
?>

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

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

<?php
  echo "The result has ".mysql_num_rows($result)
/*הפונקציה מחזירה את מספר השורות
בתוצאת השאילתא $result.
פונקציה זו עובדת רק לגבי שאילתות SELECT.
*/
." rows.";
?>

אם השאילתא לא הייתה מסוג SELECT, אלא מסוג של INSERT, DELETE, UPDATE או ALTER, אז משתמשים בפונקציה mysql_affected_rows() כדי לדעת כמה שורות בטבלה הושפעו מן השאילתא. הפונקציה לא מקבלת את התוצאה של השאילתא כפרמטר, על-כן היא מתייחסת תמיד לשאילתא האחרונה שבוצעה.

<?php
  mysql_query("DELETE FROM players WHERE age<12");
/*מריץ שאילתת מחיקה (delete),
שמוחקת את כל השחקנים שגילם מתחת ל-12.
*/

  $num_deleted=mysql_affected_rows()
/*מחזיר את מספר השורות שהושפעו
כתוצאה מהרצת השאילתא האחרונה.
*/
;
  echo "$num_deleted players were too young to play in the league.";
?>


תגובות בנושא

מהו הסינטס המלא של INSERT.ALERT,UPDATE וכו... 03-12-02 22:01
 גיל בר-טור
#99

מהו הסינטקס המלא לפקודות אלו?
כיצד משתמשים בהם?

שגיעה 31-10-02 19:01
 אלון
#499

שלום אני מקבל אתה השגיעה הזאת:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:phpdevwwwpublicformresponse.php on line 24
ואין לי מושג מה לעשות אם זה...
שאלתי כמה חברים אבל גם להם אין מושג P:

MySQL Result Resource 31-10-02 20:00
 אלי חן (מנהל)
#505

כאשר מריצים שאילתא ב-MySQL דרך PHP (באמצעות הפונקציה mysql_query), אז הפונקציה מחזירה משאב של תוצאת MySQL (נקרא: MySQL result resource)... אם הפונקציה נכשלה להריץ את השאילתא אז היא מחזירה FALSE (שהוא לא משאב תוצאת MySQL).
השגיאה שקיבלת ככל הנראה נובעת מהרצת שאילתא לא חוקית ב-MySQL. תבדוק את השאילתא הקודמת שלך, כי היא כנראה מחזירה FALSE.
פעמים רבות גם שוכחים לבחור DB בתוך MySQL שעליו מריצים את השאילתות. אם לא נבחר DB, אז כל הרצת שאילתא תחזיר FALSE. (בחירת DB נעשית עם הפונקציה mysql_select_db).

איך אפשר לקרוא מידע בלי הלולאה? 02-11-02 06:01
 בלה
#608

איך אפשר לקרוא מידע בלי הלולאה?

חלוקת השאילתא לדפים 06-12-03 06:02
 [ללא שם]
#899

שלום,
יש לי טבלה בשם myTable, יש בה 100 רשומות, אני לא רוצה להציג את כולן בדף אחד אלא לחלק את הרשומות ל 10 דפים של 10 רשומות בכל דף.
השאילתא היא כזאת אם אינני טועה:
mysql_query("SELECT * FROM myTable LIMIT 10");
אבל זה מציג רק 10 רשומות, ולא מחלק לדפים.
כיצד מחלקים לדפים?
תודה רבה מראש

קריאת שורה אחת 06-12-03 08:02
 אורי
#905

נניח שהרצתי את השאילתא הזו:
SELCT * FROM players WHERE age<12
ואני יודע שקיימת רק שורה אחת שמתאימה למשפט הזה. איך אני קורא אותה? גם פה צריך להתשמש בלולאה?

LIMIT offset,amount 06-12-03 09:02
 אלי חן (מנהל)
#912

השתמש בשאילתא שלך ב-LIMIT שהמבנה שלו הוא:
LIMIT offset,amount
כאשר offset הוא מספר הרשומה ממנה להתחיל (המספור מתחיל מ-0), ו-amount הוא מספר הרשומות המקסימלי שהשאילתא תחזיר.
כאשר ה-offset לא מצוין אז MySQL מחזירה מקסימום amount רשומות מהתחלה.

בדוגמא שלך גם נשתמש ב-LIMIT.
הדף הראשון: LIMIT 0,10
הדף השני: LIMIT 10,10
הדף השלישי: LIMIT 20,10
...
הדף העשירי: LIMIT 90,10

איתחול אובייקט השאילתה 08-12-03 20:01
 אלעד נחום
#1078

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

אני צריך טיפה עזרה 08-12-03 22:00
 poetic_scarecrow
#1081

נכון, הפקודות האלו מציגות את התוכן מהדאטה בייס אל הדף.

אבל איך קובעים לפי איזה סדר?
למשל אצלי יש עמודה שנקראת UpdateID,
וזה מסדר לפיה.

אבל אם אני רוצה שהסדר יהיה הפוך?
שקודם יבואו הדברים האחרונים?

שימוש בשליפה 09-12-03 02:01
 דניאל
#1091

אממ
אני רוצה לעבור מהשליפה שורה שורה אבל אחר כך לחזור להתחלה של השליפה
איך אפשר?

mysql_data_seek 09-12-03 18:02
 אלי חן (מנהל)
#1123

הפונקציה הזו מזיזה את המצביע של המשאב המתקבל מ-mysql_result לשורה הרצויה. הפרמטר הראשון הוא המשאב והפרמטר השני הוא מספר השורה.
למשל: נניח כי $result מכיל את המשאב של שאילתת SELECT שהרצנו עם mysql_query. אז:
mysql_data_seek($result,5); - מזיזה את המצביע לשורה החמישית.
mysql_data_seek($result,0); - מזיזה את המצביע חזרה להתחלה, לשורה אפס.

ORDER BY 09-12-03 18:02
 אלי חן (מנהל)
#1125

ORDER BY מופיע בדר"כ בסוף השאילתא.
ORDER BY col ASC - מסדר לפי השדה col בסדר עולה (ברירת מחדל).
ORDER BY col DESC - מסדר לפי השדה col בסדר יורד.
ניתן לסדר לפי כמה שדות ביחד.

שימוש בנתומים משאילתה 10-12-03 03:01
 גלעד
#1162

אני מקבל את הנתונים שלי מהשאילתה ואני מכניס אותם למשתנה ושם זה מוצג אני מבין במערך
אז שאלתי כיצד אני יכול לשרשר עוד נתונים למערך זה
זה ממש חשוב לי
אני כותב את שני השאיתות ואני מעוניין לשרשר שוב את הנתונים מהשאילתה הראשונה ואת הנתונים מהשניה יחד לאתו משתנה (אולי מערך)
חלק ראשון
---------
SELECT contig_to_est.EST_name AS NAME
FROM contig_to_est

חלק שני
-------
SELECT contig_to_growth_cond.growth_cond
FROM contig_to_growth_cond


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

תודה רבה

חיבור שאילתות 31-10-03 17:01
 אלי חן (מנהל)
#1202

לא בדיוק הבנתי למה התכוונת, אבל אולי תוכל להשתמש ב-JOIN או ב-UNION.
אם אתה רוצה ששאילתא אחת תהיה עמודה אחת בתוצאה, ושאילתא שניה עמודה נוספת בתוצאה - השתמש ב-JOIN.
אם אתה רוצה ששאילתא אחת תשורשר לשאילתא השניה - השתמש ב-UNION (העמודות צריכות להיות מאותו סוג בדיוק).


לדף הקודםשאילת שאילתא -הקודם
לתחילת הדףלתחילת הדף
הבא- טיפול בשגיאותלדף הבא