שם עמודה בעברית בMYSQL
-
מנסה להכניס תוכן לטבלא MYSQL שהשמות של העמודות בעברית, מחזיר לי שגיאות
זה הבניה של הטבלאCREATE TABLE `form` ( `lorem` int(11) DEFAULT NULL, `ipsum` int(11) DEFAULT NULL, `שם_פרטי'` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
וזה הפקודה שלי
$columnA = 'שם_פרטי'; $columnA = 'lorem'; $columnB = 'ipsum'; $text = "INSERT INTO form ($columnA, $columnB) VALUES (:$columnA, :$columnB)"; $array = array($columnA => 1, $columnB => 2); try { $requete = $objectSQL->prepare($text); echo $requete->execute($array); $requete->fetch(); $requete->closeCursor(); } catch (Exception $e) { echo $e->getMessage(); }
וזה מה שזה מחזיר
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'שם_פרטי') VALUES ('John')' at line 1
יש רעיון איך לפתור את זה?
תודה רבה -
-
לגבי החלק הטכני:
העליתי כאן מחלקה פשוטה לשימוש בMySQL וכן MSSQL.
במחלקה זו השתמשתי ע"י קשירת הנתונים, וזה עובד חלק גם בנתונים בעברית.
אך יש לקחת נקודה פשוטה בחשבון, ישנו תו`
וישנו
'
ה
`
מיועד עבור חיתום שמות של עמודות וטבלאות וכדומה בnysql וגרש מיועד לחתימת מחרוזת.
אם אכתוב בשאילתהSELECT * FROM `users` WHERE 'columnA' = :A:
השרת לא יחפש עמודה בשם columnA אלא האם מחרוזת 'columnA' שווה את החיפוש המבוקש.
ולכן חייבים לחתום דווקא כך`columnA`
ואז השרת מזהה אותו כעמודה.
ולכן אם רוצים לקשור את שם העמודה עצמו זה בעיה, כי הקשירה מכניסה את הערך לשאילתה כמחרוזת (היות והיא מקבלת מחרוזת) לדוגמאSELECT * FROM `users` WHERE :colName = :val
יתורגם ל:
SELECT * FROM `users` WHERE 'id' = 1
ולכן זה לא יעבוד.
כי 'id' אינו שוה 1.בחלק ההשקפתי, אני מסכים שתיכנות כדאי לעשות הכל באנגלית כי הוא יותר נתמך, וכו'.
אבל לא לזלזל בשימוש בעברית, למרות שאני משתדל לא להצטרך להגיע לעברית, אבל יצא לי פה ושם שהייתי צריך לעשות דברים בעברית, וזה לא היה בעייתי לא בPHP, לא בMYSQL, וגם לא בAPI לדפדפן כשהמערך JSON משתמש במפתחות בעברית.
וכהנה רבות.
ישנו בתודעה של מפתחים שאין להשתמש בעברית, אבל אם באמת תוכנה/שפה זו כן תומכת בעברית, אז מה באמת הבעיה??? -
תודה לכולם
מצאתי פיתרון פשוט מאוד, למרות שלא הבנתי עד הסוף למה הוא עובד...
הבעייה היתה שהייתי משתמש בקוד כזה$text = "INSERT INTO form ($columnA, $columnB) VALUES (:$columnA, :$columnB)"; $array = array($columnA => 1, $columnB => 2);
אבל החלפתי לזה
$text = "INSERT INTO form ($columnA, $columnB) VALUES (?, ?)"; $array = array(1, 2);
ועכשיו הכל עובד תקין.
-
@מנצפך אמר בשם עמודה בעברית בMYSQL:
זה לא מקצועי
למה זה אמור להפריע למישהו? נגיד למשל בישיבה על קברו, האם איכפת למישהו אם הקוד נראה מקצועי? העיקר שיעבוד טוב.
ברור שקוד שמשותף בין כמה מפתחים יותר טוב שיהיה עקביות בין כולם והשפה הגלובלית לזה הוא אנגלית. -
@שואף אמר בשם עמודה בעברית בMYSQL:
תודה לכולם
מצאתי פיתרון פשוט מאוד, למרות שלא הבנתי עד הסוף למה הוא עובד...
הבעייה היתה שהייתי משתמש בקוד כזה$text = "INSERT INTO form ($columnA, $columnB) VALUES (:$columnA, :$columnB)"; $array = array($columnA => 1, $columnB => 2);
אבל החלפתי לזה
$text = "INSERT INTO form ($columnA, $columnB) VALUES (?, ?)"; $array = array(1, 2);
ועכשיו הכל עובד תקין.
ההא, לא שמנו לב
הבעיה הייתה לכאורה מאוד פשוטה, את לפונקציית הקשירה אתה אמור להעביר את השם שהכנסת לשאילתה שווה את הערך שלו, ולא את המשתנה עצמו.
לדוגמא:$text = "INSERT INTO form ($columnA, $columnB) VALUES (:$columnA, :$columnB)"; $array = array('$columnA' => 1, '$columnB' => 2);
ולכן עדיף בכלל שתוריד את סימן הדולר $ משם, שלא להתבלבל עם משתנה אמיתי
ועדיף לעשות כך:$text = "INSERT INTO form ($columnA, $columnB) VALUES (:columnA, :columnB)"; $array = array('columnA' => 1, 'columnB' => 2);
הרעיון של הקשירה הוא שאתה שם טקסט עבור שם דינאמי ולפניו נקודתיים, ואתה מעביר לפונצקיה את הטקסט => הערך שאתה רוצה באמת במקום הטקסט.
זאת אומרת אתה כותב בשאילתה:columnA
והפונקציה תחליף אותו לערך שלו לדוגמא'ישיבה על קברו'
-
@מנצפך אמר בשם עמודה בעברית בMYSQL:
@חוקר אמר בשם עמודה בעברית בMYSQL:
ישנו בתודעה של מפתחים שאין להשתמש בעברית, אבל אם באמת תוכנה/שפה זו כן תומכת בעברית, אז מה באמת הבעיה???
חד משמעית, זה לא מקצועי. מסרבל משפטי קוד והערות.
מסכים שזה מסרבל, וגם אני לא ממליץ.
אבל לפעמים מגיעים מתכנתים עם תפיסות שזה ממש אסור, וזה כבר לא נכון.
אסביר על מה אני מגונן
יצא לי לעבוד שהייתי צריך לתת API שמציג נתונים על המסך בדפדפן, הנתונים היו אובייקט של שמות של ערים ולכל עיר נתון מספרי שלו.
בעיקרון בפרוייקט ההוא שמות הערים היו ידועות מראש, אבל אני הכנתי בצורה להשתמש לפרוייקטים נוספים, ולכן שלחתי פשוט מערך של שם בעברית = את הערך הנוכחי לעיר זה.
ואמרתי לה שתעשה לולאה שעוברת על האובייקט ויוצרת אלמנטים שיופיע בהם "ביתר עילית 34%" לדוגמא. וס"ה שהכל יהיה דינאמי.
אך זו שטיפלה ב API היית 'מלומדת' לעומתי שאני לא למדתי בשום מקום, היא התעקשה שאין כזה דבר, היא למדה שלא משתמשים במפתחות בעברית, אין ממה לדבר.
לכן היה עלינו לעשות עבודה כפולה היא הייתה צריכה להכין מראש אלמנטים עם שמות באנגלית, אני הייתי צריך להוסיף טבלת המרות בשרת של השמות בעברית לשמות קבועים באנגלית (ובכל פרוייקט נוסף אצטרך לטעון הכל מראש).
ולמען האמת במצב מסוג זה, זה לדעתי סתם תפיסה משונה, ואסביר למה, כי ניחא כשאתה כותב בתוך הקוד שמות משתנים בעברית, זה אכן מסתרבל מכיון הכתיבה וכדומה, אבל כאן הכל נלקח מתוך הטבלה בשרת שבין כך השמות של הערים מאוחסנים בעברית, ובקוד עצמו לא בשרת ולא בדפדפן אין רמז קל לעברית, כי אתה מעביר לולאה כמוfor(let i in obj){ //code}
ה i מקבל את ערכן העברי בצורה דינאמי.
אז מה זה אחרת מכאשר הערך עצמו בעברית לכאשר המפתח בעברית כשאר אין לזה שום שום שינוי ורמז לקוד בעברית?
בקיצור לא צריך להיות מקובע שאין להשתמש בעברית לשום דבר, אך ודאי שקוד תקין יותר קל כשהוא באנגלית נקיה. -
מי שיראה את הקוד שלי יראה הרבה חוסר מקצועיות, שנובעת בעיקר מרצון לקצר תהליכים ולשנות את האפליקציה במהירות לפי צרכים חדשים, אבל בחירת של שם עמודה בעברית זה דבר מיותר, כי בכל מקרה נותנים שם, וזה לא מקצר איזשהו תהליך או איזשהו קוד, לפעמים זה נובע מחוסר היכרות של מתכנת עם השפה, אבל אדרבה, זה דבר שיכניס אותו וירגיל אותו בשפה.
-
@ב-ל
הייתי רוצה לפתוח לזה נושא חדש
אבל אני לא מבין מה בדיוק אתה מתכוון
אם אתה רוצה שהמשתמש יכתוב "שלום" ויוצג לו המילה "עולם"?
אם מדובר בכמות קטנה של ערכים? אתה עושה לולאה IF.
ואם זה כמות גדולה של ערכים?
אתה יכול לעשות מסד נתונים עם כל הנתונים, שבעמודה A אתה כותב "שלום" בעמודה B "עולם",
ואתה מחפש כל מה שהמשתמש כותב בעמודה A ,ומחזיר את התוצאה של B. -
@nigun התשובה שלך שגויה.
לא קופצים מif שמתאים גג למספר ספרתי ל"מסד נתונים" שזה לא פתרון קוד אלא דרך שונה לגמרי למטרות שונות לגמרי.
בדרך יש עוד כמה מבני נתונים בשפות תכנות שמתאימים בלעיה.
@ב-ל לא מובן מה הקשר לאשכול (שהרי השאלה קיימת גם בלועזית וגם אם היה ניתן לקרוא למשתנים בשמות מספריים זה לא היה עוזר לגימטריה). כמו"כ לא צייינת איזה שפה אתה כותב.
אני מעודד אותך לפתוח נושא חדש לעניין, ועדיף לפעול ככה כמה שיותר.