mysql_real_escape_string וחיפוש

mysql_real_escape_string וחיפוש

שלום, הוספי הגנה על הMYSQL שלי ע"י הוספת mysql_real_escape_string לפני הכנסת נתונים. הבעיה שעכשיו החיפושים לא עובדים יותר.. ז"א אם הכנסתי את הטקסט: ג'קסון, אחרי הmysql_real_escape_string הוא הופך ל ג'\קסון, אבל כשאני מחפש ג'קסון או ג'\קסון (ז"א,"%ג'\קסון%" WHERE FIELD_A LIKE זה מחזיר 0 תוצאות.. למישהו יש רעיונות? תודה!
 

shanor

New member
מממ...

נכון. מה שאתה אומר הוא נכון מאוד, לאחר שהוספת את הפונקציה של mysql_real_escape_string, חיפושי הlike הפסיקו לעבוד בכל מקום שיש לו סימנים שמהם צריך לברוח, כמו ה-' במילה ג'קסון... הסיבה היא שאתה מחפש כעת את המילה ג/'קסון שלא מופיעה במאגר עצמו. הדבר הזה מראה שכאשר הזנת את הנתונים לתוך ה- DB לא התשמשת בפונקציה הזו. למעשה המצב שבוא אתה נתקל הוא מצב של שני אנשים שמדברים בינהם, האחד בשפה אחת והשני בשפה אחרת, אם הכל היה טוב והעולם היה מושלם, לשניהם יש דג בבל (מתוך הטרמפיסט), שמתרגם באופן מיידי כל מה שאחד אומר לשני כך שלמעשה שניהם מבינים האחד את השני למרות שהם מדברים שפות שונות לחלוטין. עכשיו תחשוב שהם ממשיכים לדבר אבל בלי אותו מתורגמן מיידי, כל אחד מהם בטוח שהשני מבין בדיוק מה שנאמר כשלמעשה אף אחד מהם לא מבין מה האחר אומר. אם נצא רגע מעולם הדימיון של דאגלס אדמס אל עולם המציאות שלנו, מה שאני רוצה לומר הוא שבמאגר הנתונים שלך המילה ג'קסון מופיעה בצורה אחת ואתה מחפש אותה בצורה אחרת. המלצה, תעביר את כל הרשומות שלך במאגר הנתונים לפורמט נכון. ראשית את הנתונים שכבר נמצאים שם ושנית תעדכן את דרך הזנת הנתונים שלך כך שיכלול כבר בתוכו את mysql_real_escape_string ואז הבעיה שלך תעלם. חוץ מזה, יש לי שאלה אחרת, מדוע בשביל לחפש בתוך סטרינג שלם, אתה מעדיף את השימוש ב % % like על פני שימוש בregexp במקום? לדעתי הוא יוכל לאפשר לך הרבה יותר מרחב תנועה וחיפוש... שווה ללמוד את הנושא. מקווה שעזרתי. -=שנאור=-
 
אחד מאיתנו לא הבין

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

shanor

New member
מממ...

אוקיי, אז נראה הדבר ששניהם מדברים באותה שפה ומבינים את עצמם דיי טוב, דבר שעכשיו מקשה קצת יותר על ההסבר לסיבה שבגללה את לא מצליחה להתאים את החיפוש. לכאורה אם לבסיס הנתונים הוזן ג\'קסון חיפוש של 'ג\'קסון' like אמור להיות מספיק וטוב. לא הסתפקתי בזה, בדקתי אצלי סתם ככה, והכל עובד טוב.... האם תוכלי לייצא את מבנה הטבלה ושורה או שתיים של נתונים בעייתיים כדי לבדוק את זה? בקשר לregexp, יש לזה בתור מנוע הרבה יותר אפשרויות מאשר לlike, שווה ללמוד את הנושא כדי להכיר אותו. -=שנאור=-
 
תודה, הנה עוד פרטים..

SELECT * FROM `text_tbl` WHERE `txtName` LIKE "%ג\'קי%"​
הטבלה:
text_tbl: field Type Collation txtName varchar(250) hebrew_general_ci​
נראה הגיוני לא? חשבתי שאולי הCOLLATION דופק את הענין אז הוספתי..
 

shanor

New member
מממ...

מצטער, לא הייתי כאן מאז שלהיי חילופי יום השישי לשבת.... בקיצור, לא יכול להיות, אמרתי לעצמי. בדקתי. הנה הטבלה שלי:
CREATE TABLE `test`.`category` ( `ID` mediumint(8) NOT NULL auto_increment, `Reviewer` varchar(20) character set latin1 default NULL, `Topic` varchar(25) character set latin1 default NULL, `Subtopic` varchar(30) default NULL, `Summary` text character set latin1, `Updated` datetime default '0000-00-00 00:00:00', PRIMARY KEY (`ID`), KEY `Subject` (`Topic`), KEY `Keyword` (`keyword`), FULLTEXT KEY `Title` (`Title`), FULLTEXT KEY `Summary` (`Summary`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;​
זהו סתם מקטע של טבלה חסר כל משמעות אמיתית. הזנתי נתונים לתוכו, תוך שימוש
set names utf8; insert into `test`.`category` (`Subtopic`) values ('ג\'ורג\''); select * from test.category where subtopic like '%ג\'ורג\'%';​
כדאי לזכור שאני משתמש ב-utf8 וה-collation שלי הוא ברירת מחדל של utf8 שהוא: utf8_general_ci צריך לבדוק איך הטבלה המקורית שלך בנויה ומה הקידוד שם.... תריצי את הטבלה שלי, תזיני שתיים שלוש שורות, ותבצעי חיפוש, תגידי מה קורה, ננסה להמשיך משם. -=שנאור=-
 
למעלה