Απορία για ereg_replace ή κάτι παρεμφερές

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από cdhyper » 28 Αύγ 2007 18:49

Έχω ένα db query:

Κώδικας: Επιλογή όλων

$where_str .= "(pd.products_name like '%" . tep_db_input($keyword) . "%' or p.products_model like '%" . tep_db_input($keyword) . "%' or m.manufacturers_name like '%" . tep_db_input($keyword) . "%'";
για ένα search. Επειδή υποχρεωτικά χρησιμοποιώ latin1_bin collation για το πεδίο pd.products_name μου βγάζει τα αποτελέσματα case sensitive. Δηλ. το α είναι διαφορετικό από το Α. Θέλω μέσω της php να παρακάμψω αυτό το εμπόδιο και δοκίμασα την ereg_replace και έβαλα πριν πχ για το Α:

Κώδικας: Επιλογή όλων

$keyword = ereg_replace ("Α", "α", $keyword);
Αυτό όμως μου θεωρεί το Α κεφαλαίο σαν α μικρό με αποτέλεσμα να μου βγάζει (αφού είναι case sensitive) μόνο τα αποτελέσματα για το α μικρό και όχι τα αποτελέσματα που υπάρχουν για το Α κεφαλαίο.

Πώς μπορώ να λύσω αυτό το πρόβλημα και να μου θεωρεί το α μικρό και το Α κεφαλαίο το ίδιο πράγμα; Και αυτό βέβαια θα ισχύει για όλη την ελληνική αλφάβητο. Σημείωση: στην Mysql δεν πρέπει να αλλάξω τίποτα.
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
tix-3-
Δημοσιεύσεις: 827
Εγγραφή: 25 Μαρ 2004 05:12
Τοποθεσία: Θεσσαλονικη-Καβαλα-βεροια(το τριγωνο της καταρας)
Επικοινωνία:

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από tix-3- » 28 Αύγ 2007 22:02

Απο οσο θυμαμαι αν βαλεις binary στο where δηλαδη

Κώδικας: Επιλογή όλων

WHERE BINARY
Το κανει ειτε case sensitive ειτε case insensitive.
Για ελληνικα δεν ξερω ανα δουλευει.
Αλλιως νομιζω οτι δεν γλυτωνεις τα 2 queries.

Υ.γ. Shot in the dark ειναι λογικα καποιος θα την βρει την λυση
Αν δεν υπήρχανε οι κνίτες κι'η ηρωίνη...

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από cdhyper » 28 Αύγ 2007 22:09

Αυτό είναι για να το κάνεις case sensitive.
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
dik_
Δημοσιεύσεις: 476
Εγγραφή: 07 Ιουν 2007 11:28

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από dik_ » 29 Αύγ 2007 06:35

Αν κατάλαβα καλά και μπορείς να αλλάξεις το query (αλλά όχι το schema της DB), τότε δοκίμασε κάτι τέτοιο:

Κώδικας: Επιλογή όλων

$where_str .= "(LOWER(pd.products_name) like '%" . strtolower(tep_db_input($keyword)) . "%' or
:)

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από cdhyper » 29 Αύγ 2007 09:24

με αυτό δεν μου βγάζει κανένα αποτέλεσμα :)

Κάτι με php δε μπορώ να κάνω; Με την παντοδύναμη php νομίζω πρέπει να γίνεται κάτι. Ε φανταστικοί php gurus;
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
Alice_Cooper
Δημοσιεύσεις: 1947
Εγγραφή: 11 Μάιος 2007 00:33
Τοποθεσία: Ioannina
Επικοινωνία:

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από Alice_Cooper » 29 Αύγ 2007 12:28

xmmm den nomizo na voithane commands tis php
ektos apo to an ta perneis ola kai ta filtrareis meso php meta ...
alla an megalosei poly h vash tha argh arketa...

afto pou edose o dik_ einai h lysh pistevo ....
apla koita ti sou epistrefei apo thn db me
LOWER kai UPPER ...
nomizo an piramatisths me aftes to xeis.

Άβαταρ μέλους
dik_
Δημοσιεύσεις: 476
Εγγραφή: 07 Ιουν 2007 11:28

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από dik_ » 29 Αύγ 2007 17:54

Αν τρέξεις ένα query σαν:

Κώδικας: Επιλογή όλων

SELECT LOWER(products_name) FROM pd WHERE products_id=12
αντικαθιστώντας το 12 με το ID ενός row του οποίου το name περιέχει σίγουρα και κεφαλαία, και αν τυπώσεις το αποτέλεσμα, είναι όλα πεζά; Το δοκίμασα σε δικό μου schema με άλλο collation και δουλεύει.

Αν δουλεύει, δοκίμασε μετά μέσα στην tep_db_input() πριν επιστρέψεις το αποτέλεσμα, κάτι τέτοιο:

Κώδικας: Επιλογή όλων

function tep_db_input($str){
    ....
    echo strtolower($str);
    return $str;
}
Αν αυτό σου τυπώνει τα search terms σε πεζά, ακόμη κι αν έβαλες και κεφαλαία, τότε λογικά θα έπρεπε να δουλέψει... :/

Εννοείται πως βάζεις τις LOWER() και strtolower() σε όλα τα OR του query σου!

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απορία για ereg_replace ή κάτι παρεμφερές

Δημοσίευση από cpulse » 30 Αύγ 2007 23:54

Κι εγώ νομίζω αν παλέψεις με τα collation θα βρεις άκρη, εκτός κι αν δουλεύεις με MySQL 3.. οπότε δύσκολα τα πράγματα.

Άλλη λύση είναι να πειράξεις την βάση. Να βάλεις ένα παραπανίσιο field με κανονικοποιημένες λέξεις. Αυτό χρειάζεται ένα function που θα κάνει normalizations, στην προκειμένη περίπτωση θα κάνει όλα τα γράμματα κεφαλαία, θα βγάζει τόνους και διαλυτικά, και άλλα τέτοια ανάλογα με το πόσο καλό θες να το κάνεις. Οπότε στο search θα ψάχνεις για ένα string που επίσης θα περνάει απο το normalization function.

Άλλη λύση είναι σε κάθε search να κάνεις χειροκίνητα (με PHP) την δουλειά της MySQL. Δηλαδή να φέρεις όλα τα αποτελέσματα και να τα φιλτράρεις με PHP. Και ανάλογα με το μέθεγος της βάσης και την συχνότητα των αναζητήσεων να σκεφτείς αν θα είναι καλό να φτιαχτεί και μια cache για να μην λιώνει ο serverάκος.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες