Beiträge von cottton
-
-
mich stört das weniger. Wenn ichs weiß, kann ichs ja sagen.
Find ich sinnvoller als wenn Du ewig in google suchst um dann auf ne Seite zu kommen wo jemand die Frage stellt
und als Antwort steht da "google doch".
Solche Threads hasse ich. Kommt gleich nach "kann geschlossen werden, ich habs hinbekommen" ... und schreibt nicht wie
-
-
Das greift bei allem, was da in der db rumlungert.
Komisch wirds bei den verschiedenen Zeichenstandards ... bin da auch noch nicht weit, aber
es gibt wohl verschiedenste Sortierungen bei a und ä und ss und ß ... ect.
Aber im Normalfall braucht man das nicht. Ob der Benutzer mit ä "Erster" ist oder der mit a ...
Kann mir aber vorstellen, dass es bei statistischen Auswertungen einer Tabelle Kopfschmerzen macht
-
-
hab ich aber auch garnich gepeilt, dass da der Stern bei DELETE nix zu suchen hat 
-
die e-mag die du bekommst reicht nicht aus.
da steht ein code 0000, aber sonst nix.
sieht mir danach aus, als wenn die func für die e-msgs nicht macht was sie soll.am besten immer die daten so nennen, wie sie genannt wurde:
SQLSTATE(...)
Driver code -- der wird hier wohl 0000 sein
Driver msgmach mal ein
print_r($SQL['ipbldel']['stmt']->errorInfo()); direkt vor generate_query_ErrorMessage() -
-
Das liegt daran, dass kein Fehler/Warung ect aufgetreten ist.
Daran hab ich garnicht gedacht
Muss ich mal angucken ... und ändern.Wenn Du nen Fehler provozierst, dann läuft alles, wie es soll:
PHPecho array().'<br>'; # muss einen Fehler schmeissen, weill man ein array nicht verketten kann, und auch nicht echo-en kann echo error_get_last_str(); # daher "findet" die func den "last" error // ausgabe: // Notice: Array to string conversion in C:\xampp\htdocs\... // Array // E_NOTICE: Array to string conversion in C:\xampp\htdocs...EDIT:
Hatte nen stupiden Fehler drin
PHPreturn ($e=error_get_last()) # wenn php function error_get_last() was zurückgibt ?FriendlyErrorType($e['type']).': '.$e['message'].' in '.$e['file'].' on line '.$e['line'] # dann mach n friendly string draus :implode(', ',error_get_last() # sonst implode NULL :D lol, fail );so isses richtig:
PHP
Alles anzeigenfunction error_get_last_str() { if(!function_exists('FriendlyErrorType')){ function FriendlyErrorType($type) { # http://www.php.net/manual/en/errorfunc.constants.php#109430 switch($type){ case E_ERROR: // 1 // return 'E_ERROR'; case E_WARNING: // 2 // return 'E_WARNING'; case E_PARSE: // 4 // return 'E_PARSE'; case E_NOTICE: // 8 // return 'E_NOTICE'; case E_CORE_ERROR: // 16 // return 'E_CORE_ERROR'; case E_CORE_WARNING: // 32 // return 'E_CORE_WARNING'; case E_CORE_ERROR: // 64 // return 'E_COMPILE_ERROR'; case E_CORE_WARNING: // 128 // return 'E_COMPILE_WARNING'; case E_USER_ERROR: // 256 // return 'E_USER_ERROR'; case E_USER_WARNING: // 512 // return 'E_USER_WARNING'; case E_USER_NOTICE: // 1024 // return 'E_USER_NOTICE'; case E_STRICT: // 2048 // return 'E_STRICT'; case E_RECOVERABLE_ERROR: // 4096 // return 'E_RECOVERABLE_ERROR'; case E_DEPRECATED: // 8192 // return 'E_DEPRECATED'; case E_USER_DEPRECATED: // 16384 // return 'E_USER_DEPRECATED'; default: return ''; } } } return ($e=error_get_last()) ?FriendlyErrorType($e['type']).': '.$e['message'].' in '.$e['file'].' on line '.$e['line'] :''; # kannst hier auch false zurückgeben lassen. wie man es mag. }
edit: schon wieder schusselfehler
-
implode rec. - nein.
Würde aber an der stelle, wo du ->errorInfo() ausliest, den String zusammenstellen.
Am besten (da immer wieder mal gebraucht wird) in einer eigenen func/methode.Zu errorInfo():
http://www.php.net/manual/en/pdo.errorinfo.phpZitat
Element Information
0 SQLSTATE error code (a five characters alphanumeric identifier defined in the ANSI SQL standard).
1 Driver-specific error code.
2 Driver-specific error message.
was Du brauchst ist [0] und [2] mMn.
Ich glaube [1] ist/war oft leer. Kann mich aber irren.Ich hatte letztens schon mal geposted, was ich nutze:
PHP$err_str = '(SQLSTATE: '.$err_info[0].') '.( (empty($err_info[2])) # wenn ebene [2] leer ?error_get_last_str() # dann get last error :$err_info[2] # sonst nimm ebene [2] ).' -- Query: '.$SQL['ipblock']['query']; # und die query anhaengen
manchmal war/ist die ebene [2] leer. Daher per error_get_last_str() den letzten error geholt.
Man kann natürlich auch:
Aber dann hast Du keine Bezeichnungen.Also noch mal übersichtlicher:
PHP
Alles anzeigen$err_info = $SQL['ipblock']['stmt']->errorInfo(); $sqlstate_err_code = $err_info[0]; # SQLSTATE error code $driver_err_code = $err_info[1]; # Driver-specific error code $driver_err_msg = $err_info[2]; # Driver-specific error message if(empty($driver_err_msg)){ # wenn mal keine msg vorhanden, sondern nur der e-code $driver_err_msg = error_get_last_str(); } $e_msg = '(SQLSTATE: '.$sqlstate_err_code.')'; # () klammer sind geschmackssache $e_msg .= ' (driver e-code: '.$driver_err_code.')'; $e_msg .= ' '.$driver_err_msg.')'; $e_msg .= ' -- Query: '.$SQL['ipblock']['query']; # ich hab immer gern gleich die query vor augen, die das verursacht hat =)edit:
sorry - vergessen: die func "error_get_last_str" ist ja nicht vordefiniert
hier is sie:PHP
Alles anzeigenfunction error_get_last_str() { if(!function_exists('FriendlyErrorType')){ function FriendlyErrorType($type) { # http://www.php.net/manual/en/errorfunc.constants.php#109430 switch($type){ case E_ERROR: // 1 // return 'E_ERROR'; case E_WARNING: // 2 // return 'E_WARNING'; case E_PARSE: // 4 // return 'E_PARSE'; case E_NOTICE: // 8 // return 'E_NOTICE'; case E_CORE_ERROR: // 16 // return 'E_CORE_ERROR'; case E_CORE_WARNING: // 32 // return 'E_CORE_WARNING'; case E_CORE_ERROR: // 64 // return 'E_COMPILE_ERROR'; case E_CORE_WARNING: // 128 // return 'E_COMPILE_WARNING'; case E_USER_ERROR: // 256 // return 'E_USER_ERROR'; case E_USER_WARNING: // 512 // return 'E_USER_WARNING'; case E_USER_NOTICE: // 1024 // return 'E_USER_NOTICE'; case E_STRICT: // 2048 // return 'E_STRICT'; case E_RECOVERABLE_ERROR: // 4096 // return 'E_RECOVERABLE_ERROR'; case E_DEPRECATED: // 8192 // return 'E_DEPRECATED'; case E_USER_DEPRECATED: // 16384 // return 'E_USER_DEPRECATED'; default: return ''; } } } return ($e=error_get_last())?FriendlyErrorType($e['type']).': '.$e['message'].' in '.$e['file'].' on line '.$e['line']:implode(', ',error_get_last()); } -
implode wuerd ich sagen.
oh, jetzt haste editiert ... mom ... lesen

Warum global auf einmal?
Wenn die function in der gleichen Klasse ist, dann kannste doch $this->SYS nutzen oO?Zu dem message array:
wenn Du dort e-msgs sammelst, dann immer so, dass Du eine "Variante" erwarten kannst.
Also nicht einmal ein String, oder manchmal ein Array. Dann besser immer ein Array.
Auch wenn Du im code weißt, dass es nur eine msg wird.
Dann besser [] = array($single_msg)
Denn dann kannst Du immer erwarten, dass es ein Array ist.und dann halt wie oben schon gesagt: implode()
und warum schickst Du alle vars in das SYS-Array ? Sogar i ?
-
Loesung: http://stackoverflow.com/questions/2068…ectories-in-php
PSR-0: http://petermoulding.com/php/psr#psr-0Jetzt versteh ich auch was ich da in den anderen Frameworks gelesen hab. Die nutzen diese oder eine aehnliche Methode =)
(Voraussetzung: Verstaendnis/Nutzung von namespace (siehe php.net))EDIT: was mir aber daran nicht gefaellt ist, dass man überall den namespace direkt angeben muss.
Ich kann also nicht in der config.php den Pfad INC definieren und
namespace INC;
nutzen.Daher muss bei jeder Pfadaenderung der namespace in den Files geaendert werden -.-
EDIT2: weg mit namespace und her mit der neuen Idee

Wie gesagt - mit der psr-0 methode(?) muss man namespace nutzen. Und namespace kann sinnvoll sein, kann aber auch nerven.
Und ich fang definitiv nicht an in jedes File den namespace manuell zu setzen. Dynamisch scheint namespace (das Setzen des namespace ...;) ja nicht nutzbar.Da ja mein Loader sowieso so aufgebaut war, dass er sich bestimmte Verzeichnisse krallt, war die Aenderung recht einfach.
Was mach der Loader?
- lade alle Dateien von Verzeichnis X
- registriere alle Dateien von Verzeichnis YBei den Klassen wird also nichts geladen, sondern gemerkt wo was liegt.
Wenn dann mal ne Klasse ueber autoload gesucht wird, wird in der Liste gesucht.Darauf gekommen bin ich, weil die variante mit namespace aehnlich funktioniert - nur halt mit den Pfadangaben im namespace ...
Nur gefaellt mir meine Variante besser, denn ich brauche keine Pfade manuell platzieren, der Hauptpfad ist einmal in der config.php hinterlegt,
und ueber die Loader::_load() kann ich die (wenn man es so nennen will) "Pfad-whitelist" jederzeit anpassen =)Hier mal der code:
PHP
Alles anzeigen<?php class Loader { private static $fatalerror_loader_logfile = 'LOADER_ELOG.txt', $memory = array(); public static function _load() { require_once 'config.php'; self::_autoloadRegister(); self::getFilesFromFolder(PATH_INC_PHP,'php',true); $_GET = arrayWalkRecursiveCallUserFunc($_GET,array('trim','set_numeric_type')); $_POST = arrayWalkRecursiveCallUserFunc($_POST,array('trim','set_numeric_type')); foreach( array( PATH_INC_MODULES_DEFAULT => 'php', PATH_INC_MODULES_OTHERS => 'php' ) as $path => $extension ){ self::getModulesByFolderName($path,$extension); } return; } private static function _autoloadRegister() { /* PSR-0 -- no need spl_autoload_register( # credits: http://stackoverflow.com/questions/20681689/how-to-use-spl-autoload-register-for-multiple-diectories-in-php function($className){ $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if($lastNsPos = strrpos($className,'\\')){ $namespace = substr($className,0,$lastNsPos); $className = substr($className,$lastNsPos + 1); $fileName = str_replace('\\',DIRECTORY_SEPARATOR,$namespace).DIRECTORY_SEPARATOR; } $fileName .= str_replace('_',DIRECTORY_SEPARATOR,$className).'.php'; if(file_exists($fileName)){ require_once $fileName; return true; } } );*/ spl_autoload_register( function($classname){ $tried = array(); foreach(self::$memory as $arr){ if($arr['name'] != $classname){ continue; } $tried[] = $arr['path'].$arr['file']; if(file_exists($arr['path'].$arr['file'])){ require_once $arr['path'].$arr['file']; # if class has a method onload() it will be called: if( class_exists($classname) and method_exists($classname,'onload') and is_callable(array($classname,'onload')) ){ $classname::onload($arr['path']); } return true; } } $str = 'unable to autoload class `'.htmlspecialchars($classname).'`!{BREAK}'. 'Checked paths:{BREAK} - '.implode('{BREAK} - ',$tried).'{BREAK}'; error_log('Warning: '.str_replace('{BREAK}',"\r\n",$str),3,self::$fatalerror_loader_logfile); trigger_error(str_replace('{BREAK}','<br>',$str),E_USER_WARNING); } ); return; } private static function getFilesFromFolder($path,$extension,$load=false) { foreach(glob($path."*.".$extension) as $file){ # getting here all files from the current folder ($path) self::$memory[] = array( 'name' => str_replace($path,'',str_replace('.'.$extension,'',$file)), 'file' => str_replace($path,'',$file), 'path' => $path, ); if($load){ require_once $file; } } return; } private static function getModulesByFolderName($path,$extension) { foreach(scandir($path) as $item){ # getting here all folders as $item # single files will be ignored # there is no reason why a single file is in one of the main folders if($item != '.' and $item != '..' and !is_link($path.$item)and is_dir($path.$item)){ self::getFilesFromFolder($path.$item.DIRECTORY_SEPARATOR,$extension,false); } } return; } } ?> -
Mit der PDO (richtig genutzt) kann da nix passieren. Dann landet der String nur wieder in der db.
-
inverted injections sind injections hintenrum

Wollte das mal testen, dann aber vergessen.Finde gerade nix im Netz, aber das Prinzip ist (nicht wie angenommen in meinem Post vorher),
dass (wie auch immer) ein String in die db komme wie zB:Zitat
alert('hallo'); -- irgendwas ganz boeses
Wenn man mit den db-Daten jetzt eine vorgefertigte Form ausgibt, und die Daten nicht maskiert (htmlspecialchars zB),
dann wird das ausgeführt - hintenrum.Das war allerdings keine SQL-Injection.
Bei der muesste man wissen, wie das Script arbeitet.
Man bekommt einen String likeZitat
meinname', `admin` = 1; --
# halt irgend ne sql-injection
von der db in den Namen des Benutzers zurueck. Der String kam auf irgend einem ungefilterten Weg in die db.
Beim (ver-)arbeiten mit dem Datensatz will das Script nu irgendwas updaten
und der coder hat nur $_POST vars maskiert -- er geht also davon aus, dass hier nix passieren kann:Zitat
"
UPDATE db.tbl
SET name = '".$dievar."'
WEHRE name = '".$dievar."'
"
und dabei ensteht das hier:Zitat
"
UPDATE db.tbl
SET name = 'meinname', `admin` = 1; -- '
WEHRE name = 'meinname', `admin` = 1; -- '
"
Es gibt sicher bessere Bsp. Ist aber bissl Kopffasching ;D -
Geht doch =)
PHP
Alles anzeigen<?php class usermag{ // fillable vars var $username; var $password; public function debug() { return $this->SYS; } function __construct(&$SYS){ //außen + innen verknüpfen $this->SYS =& $SYS; //filtern $this->username = trim($this->username); $this->password = trim($this->password); $_SESSION['user']['username'] = $this->username; //evtl Verbindung erneuern try { $this->SYS['conf']['db']['conect'] = new PDO('mysql:host='.$SYS['conf']['db']['server'].';dbname='.$SYS['conf']['db']['database'], $SYS['conf']['db']['user'], $SYS['conf']['db']['password'],array(PDO::ATTR_PERSISTENT => true)); } catch(PDOException $e) { $SYS['conf']['db']['status'] = 1; $SYS['conf']['db']['message'][] = $e->getMessage(); }#catch } function checklogIn(){ #... } function userLogIn(){ echo $this->username.' logged in.'; } function userLogOut(){ echo $this->username.' logged out.'; } } # test: $SYS['conf']['db']['conect'] = false; $SYS['conf']['db']['server'] = 'localhost'; $SYS['conf']['db']['database'] = 'keine'; $SYS['conf']['db']['user'] = 'falsch'; $SYS['conf']['db']['password'] = 'auchfalsch'; $obj = new usermag($SYS); /*DEBUG*/ test($obj->debug(),'$obj->debug() --innen'); /*DEBUG*/ test($SYS,'$SYS --aussen'); # testweise die $SYS aussen auf null setzen # (sollte dann auch innen null sein) $SYS = null; echo '<hr>testweise aussen auf null gesetzt<br>'; /*DEBUG*/ test($obj->debug(),'$obj->debug() --innen'); /*DEBUG*/ test($SYS,'$SYS --aussen'); function test($val,$title=''){ $br = '<br />'; echo '<pre># <b>DEBUG</b>: <u>'.$title.'</u>'.$br; echo '<i>type:</i> '.gettype($val).$br.'<i>val:</i> '; if(is_bool($val)){ echo ($val === true)?'true':'false'; }elseif(is_null($val)){ echo 'NULL'; }elseif(!is_numeric($val)and empty($val)){ echo 'empty'; }elseif(is_resource($val)){ echo get_resource_type($val); }else{ print_r($val); } echo $br.'#/DEBUG</pre>'; } ?>Den Fehler "Fatal error: Call to undefined function sqlInfo() in .. on line 243" bekomme ich nicht. Sehe auch nirgends eine function sqlinfo() genutzt oO?
Aber hier stimmt was nicht:PHP
Alles anzeigen# ... # hier bekommst du die returned rows: $SQL['ipblock']['rows'] = $SQL['ipblock']['stmt']->rowCount(); # angenommen 1 echo $SQL['ipblock']['rows']; while($SQL['ipblock']['fetch'] = $SQL['ipblock']['stmt']->fetch(PDO::FETCH_ASSOC)){ # und hier erhoehst du sie pro row :D $SQL['ipblock']['rows'] ++; # wenn ->rowCount() 1 war, dann sind wir jetzt bei 2 =) # besser wäre hier wohl eine var $i=0, die dann hochzaehlt $SQL['ipblock']['exec'][$SQL['ipblock']['rows']]['id'] = $SQL['ipblock']['fetch']['id']; $SQL['ipblock']['exec'][$SQL['ipblock']['rows']]['ip'] = $SQL['ipblock']['fetch']['ip']; $SQL['ipblock']['exec'][$SQL['ipblock']['rows']]['time'] = $SQL['ipblock']['fetch']['time']; $SQL['ipblock']['exec'][$SQL['ipblock']['rows']]['until'] = $SQL['ipblock']['fetch']['until']; $SQL['ipblock']['exec'][$SQL['ipblock']['rows']]['reason'] = $SQL['ipblock']['fetch']['reason']; }btw: Du musst noch einen evtl Fehler bei ->execute abfangen:
PHP
Alles anzeigen$SQL['ipblock']['query'] = "SELECT * FROM `blockedip` WHERE `ip` = :ip;"; $SQL['ipblock']['stmt'] = $this->SYS['conf']['db']['conect']->prepare($SQL['ipblock']['query']); if( !$SQL['ipblock']['stmt']->execute( array( ':ip' => $_SESSION['user']['ip'] ) ) ){ print_r($SQL['ipblock']['stmt']->errorInfo()); # anstatt print_r dann hier den fehler behandeln. # zB: $err_info = $SQL['ipblock']['stmt']->errorInfo(); # ist ein array mit infos zum fehler # zB $err_info[0] // SQLSTATE ... # # kann man dann in einen string packen: $err_str = '(SQLSTATE: '.$err_info[0].') '.( (empty($err_info[2])) # wenn ebene [2] leer ?error_get_last_str() # dann get last error :$err_info[2] # sonst nimm ebene [2] ).' -- Query: '.$SQL['ipblock']['query']; # und die query anhaengen # # jetzt nur noch den string $err_str in ne logdatei speichern ... } # das prinzip noch mal "kleiner": if(!$stmt->execute(){ # wenn fehler beim ausfuehren print_r($stmt->errorInfo()); # dann fehler behandeln }else{ # sonst while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ # hol die die daten $result['row'][] = $row; } } -
http://www.php.net/manual/de/pdo.connections.php
Bei "Beispiel #4 Persistente Verbindungen"ZitatPersistente Verbindungen werden nicht am Ende des Skripts geschlossen, sondern werden gecacht und wiederverwendet, ...
Dadurch fällt das connecten bei jedem erneuten aufrufen der Seite weg./
Bei mir ging es mit Deinem Bsp oO? -
Für die db - ja.
Im anderen Thread hatte ich das mit den ->prepare und ->execure geposted.
Wenn Du die PDO nutzt, und immer Platzhalter verwendest, dann ist eine Sql-Injection nicht möglich.http://de3.php.net/pdo.prepared-statements
Zitat
Wenn eine Anwendung ausschließlich Prepared Statements benutzt, kann sich der Entwickler sicher sein, dass keine SQL-Injection auftreten wird. (Wenn aber trotzdem andere Teile der Abfrage aus nicht zuverlässigen Eingaben generiert werden, ist dies immer noch möglich.)
Du musst allerdings (sowieso) aufpassen, was auf welchem Weg in die db kommt. Basiii hatte mir das mal gesagt: inverted(glaub ich) injections.Aber das läuft so weit ich weiß nicht mit normalen Sql-Anweisungen. Da müsste schon was ausgefallenes her. -
htmlspecialchars oder htmlentities brauchst Du bei der Ausgabe (zB Browser).
Und wegen den Injections:
mysqli_real_escape_string() / mysql_real_escape_string()Aber die escape-dinger brauchst Du nicht mehr, wenn Du die PDO (richtig) nutzt.
-
Das geht auch =)
BTW: Du nutzt die PDO, dann aber keine Daten direkt in die Query!PHP// auch wenn es die SESSION ist - beim nächsten mal vergisst du iwas und nutzt POST ect in der query. $_SESSION['user']['ip'] = "' AND `ip` = 'nicht vorhanden; --'"; $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';");
Nutze besser ->prepare und ->execute
http://www.php.net/manual/de/pdo.query.phpPHP
Alles anzeigen$dbconnect = new PDO('mysql:host=host','name','pw',array(PDO::ATTR_PERSISTENT => true)); # persitent muss nicht sein # ... $query = "SELECT * FROM `blockedip` WHERE `ip` = :ip;"; $stmt = $dbconnect->prepare($query); $stmt->execute( array( ':ip' => $_SESSION['user']['ip'] # BTW: es geht auch OHNE : (doppelpunkt) in den parametern # 'ip' => $_SESSION['user']['ip'] # das macht es einfach mit arrays dynamisch zu arbeiten ) ); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ # ... } -
Muss ja beides (aussen und innen) anzeigen, denn Du verkettest ja Drinnen:
PHP$this->SYS['conf']['db']['message'] /*die msg ist*/ = $this->SYS['conf']['db']['message'] /*die msg*/ . /*und*/" || ".$e->getMessage();
hier mal n test ohne der Verkettung. Dafür als array:
PHP
Alles anzeigen<?php class usermag { var $username; function __construct(&$SYS){ //außen + innen verknüpfen $this->SYS =& $SYS; } function logIn($pw){ try { # absichlicher fehler: $dbconnect = new PDO('failme'); /* $dbconnect = new PDO('mysql:host='.$this->SYS['conf']['db']['server'].';dbname='.$this->SYS['conf']['db']['database'], $this->SYS['conf']['db']['user'], $this->SYS['conf']['db']['password']); // IP geblockt? $sql = $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';"); $sql = $sql->rowCount(); if ($sql >= "1" || $_SESSION['user']['blocked']) { //IP geblockt echo "<p>Blocked</p>"; } echo $this->username." logged in."; echo "Password is:".$pw;*/ } catch(PDOException $e) { $this->SYS['conf']['db']['satus'] = 1; $this->SYS['conf']['db']['message'][] = $e->getMessage(); #echo "<br>-------------<br>".$this->SYS['conf']['db']['message']."<br>-------------<br>";//gibt die außen + innen aus }#catch } } $SYS['conf']['db']['satus'] = 'aussen'; $SYS['conf']['db']['message'][] = 'aussen'; /*DEBUG*/ test($SYS,'$SYS ganz am anfang'); $obj = new usermag($SYS); $obj->logIn('wieso muss hier n pw rein?'); /*DEBUG*/ test($SYS,'$SYS nachdem von innen was geadded wurde'); function test($val,$title=''){ $br = '<br />'; echo '<pre># <b>DEBUG</b>: <u>'.$title.'</u>'.$br; echo '<i>type:</i> '.gettype($val).$br.'<i>val:</i> '; if(is_bool($val)){ echo ($val === true)?'true':'false'; }elseif(is_null($val)){ echo 'NULL'; }elseif(!is_numeric($val)and empty($val)){ echo 'empty'; }elseif(is_resource($val)){ echo get_resource_type($val); }else{ print_r($val); } echo $br.'#/DEBUG</pre>'; } ?>zum 2. Fehler:
Daran liegts.
$dbconnect ist sicherlich ein Objekt von PDO.
Daher:PHP$sql['ipblock'] = $dbconnect->query("SELECT * FROM `blockedip` WHERE `ip` = '".$_SESSION['user']['ip']."';"); // PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
Also $sql['ipblock'] ist jetzt ein obkect. Du kannst also keine Array-Ebene reinquetschen =)
Besser ne temp-var: