Autor | Zpráva | ||
---|---|---|---|
Lorem Profil * |
#1 · Zasláno: 14. 5. 2012, 23:12:59
Dobrý večer,
mám prostou, ale očividně nevyřešitelnou otázku =) Script níže by měl po zadání zkontrolovat přístupové údaje pomocí MySQL databáze. Zasekla jsem se však už u prvního kroku a tj. u chybové hlášky ERROR102 - Chyba synchronizace. Sranda je v tom, že v ostatních scriptech mi připojení k databázi normálně funguje =) Nevíte někdo, co s tím? =D Předem vám všem mockrát děkuji =) // MYSQL CONNECTION $mysql_server = '*****'; $mysql_user = '*****'; $mysql_password = '*****'; // MYSQL USER VERIFICATION $mysql_verification_database = '*****'; $mysql1_conn = @mysql_connect ($mysql_server,$mysql_user,$mysql_password); $mysql1_db = @mysql_select_db ($mysql_verification_database); // USER DATABASE ACCESS if(isset($_REQUEST['login']['user']) && isset($_REQUEST['login']['pass'])) { if ($mysql1_conn && $mysql1_db) { $cnt['cron_key'] = mysql_result(mysql_query('SELECT COUNT(id) FROM settings WHERE name=\'key\''),0); if($cnt['cron_key']==1) { $sql['key'] = mysql_fetch_array(mysql_query('SELECT value FROM settings WHERE name=\'key\'')); $key = $sql['key']['value']; } $cnt['login_mysql'] = mysql_result(mysql_query('SELECT COUNT(id) FROM users WHERE pass=\''.$_REQUEST['login']['user'].'\' AND login=\''.$_REQUEST['login']['pass'].'\''),0); if(!$key) { $error['login'] = 'ERROR 101 - Chyba synchronizace'; } elseif($cnt['login_mysql']==1) { $sql['clientdb'] = mysql_fetch_array(mysql_query('SELECT mysql_server, mysql_user, mysql_pass, mysql_database, verification, id FROM users WHERE pass=\''.$_REQUEST['login']['user'].'\' AND login=\''.$_REQUEST['login']['pass'].'\'')); if($sql['clientdb']['ip']==0) { $_SESSION['uniadczadmin']['id'] = $sql['clientdb']['id']; $_SESSION[$key]['connection'] = @mysql_connect($sql['clientdb']['mysql_server'],$sql['clientdb']['mysql_user'],$sql['clientdb']['mysql_pass']); $_SESSION[$key]['db'] = @mysql_select_db($sql['clientdb']); $_SESSION[$key]['mysql_database'] = $_SERVER['REMOTE_ADDR']; $_SESSION[$key]['id'] = $sql['clientdb']['id']; $save_time = time(); $_SESSION[$key]['time'] = $save_time; $query['insert_access'] = mysql_query('INSERT INTO access (id_client,time,ip,key) VALUES (\''.$sql['clientdb']['id'].'\',\''.$save_time.'\',\''.$_SERVER['REMOTE_ADDR'].'\',\''.$key.'\')'); if($query['insert_access']) { $done['login'] = 1; } } else { $error['login'] = 'IP adresa '.$_SERVER['REMOTE_ADDR'].' není pro tento účet povolena'; } } else { $error['login'] = 'Špatné přihlašovací údaje'; } } else { $error['login'] = 'ERROR 102 - Chyba synchronizace'; } } |
||
Hando Profil |
#2 · Zasláno: 14. 5. 2012, 23:42:11
Ahoj.
Chyba 102 znamená, že není splněna podmínka if ($mysql1_conn && $mysql1_db) . Co to vypíše, když se odstraní ty zavináče před mysql_connect a mysql_select_db?
|
||
Lorem Profil * |
#3 · Zasláno: 14. 5. 2012, 23:54:15
Hando :
Hahá, =D Mě blbou to nenapadlo, tak databáze už běží, měla jsem jen špatně vyplněný server =) Každopádně máme tu problém č. 2 =D A to sice : Warning: mysql_result() expects parameter 1 to be resource, boolean given in **** on line 25, což je první řádek ve scriptu s countem =( |
||
Hando Profil |
#4 · Zasláno: 15. 5. 2012, 00:07:47
A co to vrací, když se ten dotaz prožene konzolí mysql v phpmyadminu, nebo v tom, co používáš? Jinak nebylo by přehlednější, psát mysql dotazy do uvozovek, než v nich pak escapovat apostrofy?
|
||
Lorem Profil * |
#5 · Zasláno: 15. 5. 2012, 00:10:51
Vše vrátí nulový výsledek =/...Jako bych v DB vůbec nebyla =D A mimochodem, už jsme u ERRORU 101, tj. nulová hodnota proměnné $key = Proměnná neobdržela žádná data z DB =/ Tabulky i databáze je správná, čím to bude? =D
Dle mě je tohle o zvyku =) Pro mě je to pohodlnější =) |
||
Hando Profil |
#6 · Zasláno: 15. 5. 2012, 00:34:06
Tohle
SELECT COUNT(id) FROM settings WHERE name='key' , když se napíše do konzole, jak jsem psal výše, tak to nic nenajde?
|
||
Lorem Profil * |
#7 · Zasláno: 15. 5. 2012, 00:35:11
Jo, to ano, vyhodí mi jeden výsledek
|
||
Enko Profil * |
#8 · Zasláno: 15. 5. 2012, 01:53:40 · Upravil/a: Moderátor (editace znemožněna) 15. 5. 2012, 14:09:34
Nechci být hnidopich, díval jsem se zběžně na ten kód v prvním článku, ale je náchylný na SQL Injection, protože přímo do SQL dotazu vkládáte neošetřená data. Co takhle všechna $_REQUEST[] prohnat ještě přes mysql_real_escape_string(). Hmm...?
|
||
Lorem Profil * |
#9 · Zasláno: 15. 5. 2012, 06:39:32
To je v pořádku, s touto narážkou jsem počítala =) vše se (nejen proti SQLIA) bude ošetřovat =) teď mi jde o úplně jiné problémy =)
|
||
Hando Profil |
#10 · Zasláno: 15. 5. 2012, 11:07:32
Ten druhý select (
SELECT value FROM settings WHERE name='key' ) taky vrací očekávanou hodnotu? Pokud ano, tak už mě nic moc nenapadá, proč by $key neměla existovat. Nemám moc zkušeností s dvourozměrnými poli, ale to by taky problém dělat nemělo, alespoň mně to nikdy nezlobilo.
Je tohle přesně ten samý kód, který používáš? Nevznikla někde chyba při kopírování? Asi bych to rozebral řádek po řádku a každý příkaz testoval třeba pomocí if... echo, aby se ukázalo, kde přesně je zakopaný pes. Snad poradí někdo ze zkušenějších... |
||
Enko Profil * |
#11 · Zasláno: 15. 5. 2012, 11:44:08
Postupně si nech vypisovat všechny proměnné a jestli ti vrací to co očekáváš. Zkus to třeba přes print_r() nebo var_dump(). Holt jinak na to nepříjdeš.
|
||
Tori Profil |
#12 · Zasláno: 15. 5. 2012, 11:46:51
Lorem:
Tento způsob pojmenovávání proměnných (jako vícerozměrná pole) poněkud ztěžuje orientaci v kódu. 1. Může existovat více než 1 řádek v tabulce settings, které odpovídají podmínce WHERE name = 'key'? 2. Může mít odpovídající řádek hodnotu settings.value nula (nebo něco jiného, co se vyhodnotí jako nula)? 3. Podmínka na ř.15 bude vždy splněna - porovnáváte nulu a neexistující klíč => (null == 0) => výsledek je true. (v SQL vybíráte sloupec id)
4. Řádek 18 vždy selže (pokud teda nemáte databázi s názvem "Array"), má tam být $sql['clientdb']['mysql_database'] .
|
||
Lorem Profil * |
#13 · Zasláno: 15. 5. 2012, 12:54:49
Hando :
Problém je právě v tom, že do $key se nedostane žádná informace, tedy, že mysql nic nevrátí =(...přitom přímo v konzoli u mysql vrátí správně 1 výsledek =( Enko : Víme přesně, v čem ktví zakopaný pes, otázkou je proč z databáze nic nevyleze =( Tori : Tento script je součástí mnoha scriptů a pojmenování je bohužel snad to nejjednodušší, co vůbec šlo už jen z důvodu, že vícerozměrné pole bylo potřeba. 1. V tabulce je prozatím pouze jeden záznam a ten odpovídá dotazu =( 2. Pole value nikdy neodpovídá nule =( 3. Proměnná $slq['clientdb']['ip'] může odpovídat nule pouze v případě, že neobsahuje data v určitém formátu. Ty naopak tomu nule neodpovídají. Celý problém přetrvává v nadefinování proměnné pro klíč, v tom případě soudím, že mám problém vůbec vypisovat data z mysql =( |
||
Časová prodleva: 12 let
|
0