Autor Zpráva
TFSi
Profil
Zdravím,
vyskytl se mi takový problém - mám v databázi takovouto tabulku:
REATE TABLE `teams` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`team` varchar(30) NOT NULL,
`year` tinyint(2) unsigned NOT NULL default '8',
`email` varchar(100) NOT NULL,
`heslo` varchar(32) NOT NULL,
`date` int(10) unsigned NOT NULL default '0',
`info` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2

a z ní v PHP vybírám tímto dotazem:
$sql = 'SELECT * FROM `teams` WHERE `email`="'.$email.'" LIMIT 1';

a i když jsem si 100% jist, že všechny emaily, které mám v proměnné $email mám i v databázi, tak mi to v některých případech napíše, že dotaz nevátil žádný výsledek ->tedy že uvedený email neexistuje?!

PS: emaily před vložením do DB i před vložením do dotazu proháním přes funkci strtolower();
Joker
Profil
TFSi
že všechny emaily, které mám v proměnné $email mám i v databázi
Jak všechny? Tam se porovnává jen jeden.
Jestli do $email dáváte něco jako "prvni@neco.cz,druhy@neco.cz,tretí@neco.cz", tak není divu, že to nic nenajde.
TFSi
Profil
Joker
Blbě jsem se vyjádřil. omlouvám se.
Já to myslel tak, že když se provede například
SELECT * FROM `teams` WHERE `email`="email1@example.com" LIMIT 1

tak nevybere nic, když se provede
SELECT * FROM `teams` WHERE `email`="email2@example.com" LIMIT 1

tak se vybere, když dám
SELECT * FROM `teams` WHERE `email`="email3@example.com" LIMIT 1

tak se taky vybere, když dám
SELECT * FROM `teams` WHERE `email`="email4@example.com" LIMIT 1

tak se zase nevybere nic.

a přitom v databázi všechny 4 emaily mám.
joe
Profil
Zkusil bych změnit uvozovky na apostrofy

SELECT * FROM teams WHERE email='email4@example.com' LIMIT 1
TFSi
Profil
joe
Bez účinku. Stále to některé emaily nenajde :(

Mám takovou teorii: nemohlo by to být tím, že by náhodou [CTRL]+[ALT]+[V] vkládalo nějaký jiný znak vypadající jako zavináč než [ALT]+[6]+[4]??? Pouze teorie. já už totiž Vážně netuším čím by to mohlo být... :(
Joker
Profil
TFSi
Pátral bych tímhle směrem: Nemají ty adresy, které se nevyberou, nějakou společnou zvláštní vlastnost?
Není třeba problém s nějakým speciálním znakem?

Dál mě napadá, že jestli se adresy vkládají přes copy-paste, nemohou tam být vložené ještě nějaké další znaky? Například mezery (i když operátoru = by mezery vadit neměly), tabulátor, konec řádku...
TFSi
Profil
Takže jsem po tom ještě pátral a tady jsou závěry mého celodenního snažení:
1) na lokální databázi vše funguje tak jak má, adresy se vyberou bez problému (technická podpora hostingu se mi vysmála že je to kravina, že u nich je vše v pořádku)
2) v databázi je teď 114 emailů, z toho 38 nejde vybrat (postupně jsem zkoušel všechny v phpMyAdminu na serveru, takže nějakou chybu v mých PHP skriptech jsem vyloučil)
3) 21 emailů které nejsou vybrat jsou jsou "@seznam.cz", zbytek různé. Všechny emaily v db jsou platné a funkční (posílal se na ně aktivační email)
4) během pokusů jsem přišel na to, že pokud provedu asi deset dotazů na jednu nefunkční adresu, tak začne fungovat a potom jde normálně vybrat, ale po chvilce opět fungovat přestane.
5) i když bylo mnohokrát vědecky dokázáno že bubáci a strašidla neexistující, tak ode dneška se před spaním dívám pod postel protože se tohle opravdu vymyká mému chápání.
nightfish
Profil
během pokusů jsem přišel na to, že pokud provedu asi deset dotazů na jednu nefunkční adresu, tak začne fungovat a potom jde normálně vybrat, ale po chvilce opět fungovat přestane.
hmm, to je opravdu zajímavé...
kontroluješ návratové hodnoty všech funkcí, které používáš? máš zapnutý error_reporting na E_ALL? jsi si jistý, že data, která porovnáváš, se opravdu rovnají? (nedávno tu v jednom vlákně chlapec přišel na to, že má v databázi bílé znaky - konkrétně konce řádků - kvůli kterým porovnávání neprojde) - udělej si z tabulky export (třeba přes phpMyAdmina) a podívej se na data
a taky by nemuselo být od věci všechna data vstupující do databáze otrimovat a oslashovat (mysql_real_escape_string)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0