SQL -PHP שגיאה
-
@dovid
בסוף גיליתי שבמקום להפעיל בקודת multi_query הפעלתי query.אלא מה, משהו אחר בעייתי....
אחד מההשאילתות הם זה (כאשר המשתנה מכיל אותה היא נראית כך)>$sql = " INSERT INTO shtiblech (`name`, `anterlative_name`, `amount_memerens`) VALUES ('ע\"ש ר' חיים ירט ז\"ל', 'ע\"ש ר' חיים ירט ז\"ל', '97');";
חוזרת לי שגיאה:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'חיים ירט ז"ל', 'ע"ש ר' חיים ירט ז"ל', '97')' at line 1
-
@dovid
אני מתלבט אם אני יכול בכלל להשתמש בprepareואסביר:
לצורך עבודה שאמורה להיות מותקנת ע"ג כמה מחשבים ברחבי הארץ, ובכל מחשב אמור להיות נתונים שונים בטבלאות, ולאור שאני מכין את עצמי גם לפעם הבאה שאתבקש לכך.על כל האמור בניתי סקריפט בphp שעובד באופן הבא:
- אני אמלא במשתנים בקובץ המקור את שם הdb שיש ליצור וכן את שאילתת יצירת הטבלאות, ועוד כהנה וכהנה.
- את כל הנתונים שאמורים להשתנות בין התקנה להתקנה אני מכניס בתקייה עם קבצי csv
- הסקריפט מבקש מהלקוח לבחור בנתונים אותו הוא צריך להכניס בDB.
- הסקריפט יעבור בין הקבצים ויכניס אותם לטבלה שעונה לשם הקובץ (לא כולל .csv), כמו כן השורה הראשונה מכילה את שמות העמודות בDB אליהם יש להכניס כל עמודה.
בקיצור זה ממש דינמי בין שאילתה לשאילה, זה יכול להיות כמה טבלאות שבכל אחד מס' עמודות שונה...
לא בדקתי אך נראה לי שזה לא מתאים... בפרט שהדברים נעשים אחורי הקלעים ללא קלט מהמשתמש וגם בשלב זה זה על שרת אופליין כך שאין לי חשש להתפרצויות....
תקן אותי אם טעיתי.
-
@dovid אמר בSQL -PHP שגיאה:
אבל אני מבין ממך שדוקא כן רק שזה לא ישיר
הקלט שמתקבל מהמשתמש הוא שם הקובץ או שם כולל של כל הקבצים!
כל השאר מתבצע באופן אוטו' על הקובץ.בהחלט אם הוא יכניס שם קובץ אחר זה יכול לשגע את המערכת, שוב לא מדובר במערכת עבור משתמשים לא מוכַּרים (אם הם ידפקו את עצמם.. שייהנו).
בכל מקרה הוספתי לכל מידע שיעבור דרך הפונקציה הבאה:
function clian_input($data){ $data = trim($data); $data = htmlspecialchars($data); $data = stripcslashes($data); return $data;
-
@dovid אמר בSQL -PHP שגיאה:
אתה צריך להשתמש בפרמטרים https://www.php.net/manual/en/mysqli.prepare.php
זה גם חוסך לך את כאב הראש של ניקוי המחרוזת או מה שנקרא escaping שלה, וגם מאבטח אותך. -
צריך לנקות את כל ערך שמקורו במשתמש. במקרה שלך שמדובר בקובץ גדול שעובר עיבוד ועל פיו אתה בונה טבלאות, אז אתה צריך בכל ערך שאתה משתיל בפקודת SQL לודאות את "נקיונו".
אני חושב שהפונקציה הזאת https://www.php.net/manual/en/mysqli.real-escape-string.php טובה עבורך. -
@dovid
לפי המידע שקראתי שם
הפונקציה עושה את מה שעושים הפונקציות שכתבתי לך קודם ( ()trim() , stripcslashes)
התו היחיד שהפונקציה אותה נתת בודקת יותר מהפונקציות הנ"ל הוא " ' " (גרש בודד).
בכל מקרה ניתן להוסיף אותו לפונקצית ה ()trim כמופיע כאן:
https://www.php.net/manual/en/function.trim.php
ומה שאני עושה אפילו יותר מזה זה הפונקציה ()htmlspecialchars
שמבריחה את כל תגיות הhtml למינהם... כך שאם מישהו ינסה להזריק סקריפט PHP הוא יוברח! -
@dovid אמר בSQL -PHP שגיאה:
אבל אני לא רואה אפשרות להזריק קוד PHP
גם קוד php הוא בתוך תגית...
אם אני אחזיר מהdb מידה שתוכנו הוא קוד php עם תגיות php הקוד יופעל,
מה שאין כן כרגע לאחר הניתוח של הסטרינג התגיות מוחלפות בקוד & lt; או & gt; ...
(ד.א. שמתי לב עכשיו שהפונקציה הזאת מטפלת גם בגרש בודד.)