Autor Zpráva
Lorem
Profil *
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
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 *
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
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 *
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
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 *
Jo, to ano, vyhodí mi jeden výsledek
Enko
Profil *
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 *
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
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 *
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
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 *
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 =(

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