בעיה באחסון נתונים ב mysql
-
$a = $data[0]; echo $a ."<br>"; $b = $data[1]; echo $b ."<br>"; $c = $data[2]; echo $c ."<br>"; $d = $data[3]; $d = $d.""; echo $d ."<br>"; $e = $data[4]; echo $e ."<br>"; $f = $data[5]; echo $f ."<br>"; $g = $data[6]; echo $g ."<br>"; echo "<br>"; $getInfo = $dbh->query("INSERT INTO routes (route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_color) VALUES ($a,$b,$c,$d,$e,$f,$g)");
-
@ששא לא.
הוא הביא לך קוד, הוא רוצה את הפלט של הקוד הזה.
אני אסביר לך מראש מה הבעיה. אתה משרשר ערכים בתוך שאילתה, אם בערכים האלה יש פסיק סוגריים וכל מיני כאלה, זה שובר את התחביר של השאילתה במקרה הטוב (במקרה הגרוע, למשל מישהו רוצה לתקוף אותך, הוא יכול להכניס לשמה ערך זדוני למשל שמוחק את הטבלאות או מביא לו את מה שבא לו, לזה קוראים הזרקת SQL).
@chagold ביקש ממך את הפלט כדי לראות בחוש מה שובר את התחביר, ולכן הוא אמר לך לשים לפני ההפעלה את כל הפקודה במשנה טקסט, ולהדפיס אותה למסך (echo).בכל מקרה זה רק לאבחון, הפתרון הוא לא לשרשר ערכים אלא להשתמש בפרמטרים.
במקרה כזה הספריה של pdo דואגת לטהר את המשתנים ולהפוך כל תו שיכול לשבור את התחביר לתו בטוח.
ככה משתמשים בפרמטרים:$query = $dbh->prepare("INSERT INTO routes (route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_color) VALUES (:route_id,:agency_id,:route_short_name,:route_long_name,:route_desc,:route_type,:route_color)"); $params = [ route_id => $data[0], agency_id => $data[1], route_short_name => $data[2], route_long_name => $data[3], route_desc => $data[4], route_type => $data[5], route_color => $data[6] ]; print_r($params); $query->execute($params);
-
@ששא יש לי תחושה שאולי אני פראייר רציני, ואתה בכלל לא במהלך לימודים אלא במהלך בניית פרוייקט באמצעות GPT+תחומים, שניהם חינמיים.
יש לי בהחלט הרבה פעמים רצון לעשות חסד, אבל אני לא אוהב (ואני חושב שאני פה לרבים) שמישהו "מתייעץ" איתי כדי להוציא ממני קטע קוד או עזרה טכנית, אולי זה לא מובן למישהו מבחוץ מה ההבדל, אבל הוא מהותי.
אם אני צודק תהיה יותר שקוף באשר לכוונתיך ואם אני טועה תתבייש פחות להגיד בדיוק מה אתה מבין ומה לא כ"כ אבל עובד לך, ואיזה אור אפשר לשפוך לך על נושאים שיעזרו לך להבין יותר ולהסתדר יותר. -
@dovid ממש לא נכון
אני אכן באמצע לימוד אבל הנכון הוא כן שעדיין לא הגעתי בלימודים לשלב הזה אלא התקדמתי לבד.
אתה רואה שבניתי קוד לבד ולא באתי לשאול "איך מכניסים נתונים לטבלת mysql", נכון?
המצב שלי כרגע שאני מבין איך תיכנות עובד ואת עקרי הדברים אבל לא מכיר לעומק את השפה ולכן למדתי את זה לבד מאתרים וכו' ואני יודע לבנות קוד אבל הבעיה שלי כמו שאפשר לראות ברוב שאלותי במקרה של שגיאה להבין מה קורה
ניסיתי לחפש קודם באינטרנט ורק הסתבכתי.
אני מבין את תחושתך ואת מה שהוביל לזה אבל לכן אני אומר לך שזה לא נכון אלא אני מצליח ובונה לבד קודים רבים, אבל כשאני נתקל בשגיאה הרבה פעמים אני לא מסתדר.
אז נכון, יש לי בעיה שיש הרבה פעמים שאני לא מצליח להסתדר עם שגיאות וכו' ואני צריך עזרה
חשבתי שפה המקום שיכולים ורוצים לעזור לי, אם טעיתי אנא אמרו לי ואנסה למצוא מקום אחר
אבל בכל מקרה יש לי בשבילך ולעוד כמה אנשים הכרת הטוב ענקית כי עזרתם לי וקידמתם אותי בהרבה!
תודה רבה על מה שעזרתם לי עד כה! -
תודה על ההבהרה, אני שמח.
לא הבנת אותי, זה נורמטיבי לעילא שיש לך דברים שאתה לא מסתדר (יש לי גם כל הזמן)
ולא דורשים שתשבור שום ראש לפני שאלה פה,
רק מהשתיקה שלך ואופן הצגת הקודים היה תחושה של "אני מניח את זה פה", וכמעט אפס של בקשת הסבר אלא יותר פתרון בעיה.
בכל מקרה בדוק את הקוד שהבאתי לך, ושלב בשאלותיך גם שאלות הבנה ולא רק עובד/לא עובד. -
@dovid ניסיתי, אבל משום מה הוא מקבל את השורות של הפרמטרים כקבועים, והוא נותן לי את השגיאה הבאה
Fatal error: Uncaught Error: Undefined constant "route_id" in /var/www/your_domain/csv.php:64 Stack trace: #0 {main} thrown in /var/www/your_domain/csv.php on line 64
צריך להגדיר את זה כמשתנה? -
סליחה, אני לא עטפתי את השמות במרכאות, תחליף את הקטע הרלוונטי:
$params = [ 'route_id' => $data[0], 'agency_id' => $data[1], 'route_short_name' => $data[2], 'route_long_name' => $data[3], 'route_desc' => $data[4], 'route_type' => $data[5], 'route_color' => $data[6] ];
-
@ששא כשאתה שותל משתנים, נהיה טקסט ארוך שאתה מגיש כפקודת SQL. המשתנים אמורים מבחינתך להיות ערכים, אבל הם עלולים לפעמים להכיל פקודות SQL ולהצטרף לשרשור הפקודה (לעיתים אפילו תרצה את זה כי יש לך למשל תנאי מותנה וכדומה).
אולם בקוד שכתבנו אתה לא מגיש לפקודה טקסט "מת", אלא שם שומרי מקום בערכים לומר פה אמור להיות ערך X ופה ערך Y, ובנפרד אתה מביא רשימת ערכים. ממילא הפקודה יודעת שלא אמור (ואף אסור שיהיה) בערכים הללו כל סממן של פקודה או תחביר, כי הם כל כולם בבחינת ערך.
אני מנחש שהקוד שכתבת זה עבור הכנסה של הCSV. אם ככה אתה מרויח גם מהירות, כי בתצורה הזאת של הכנת פרמטרים מראש הפקודה עובדת הרבה יותר מהר (בלולאה תחזור רק על על הexecute ולא על הprepare).