$ergebnis ist false (bool).
Heißt entweder, dass
a) die verbindung zur db nicht hergestellt wurde
b) die query fehlschlug
Prüfe auf Fehler - guck mal hier:
http://php.net/manual/de/mysqli.query.php
(Bsp 1 weiter unten bei "Prozeduraler Stil")
$ergebnis ist false (bool).
Heißt entweder, dass
a) die verbindung zur db nicht hergestellt wurde
b) die query fehlschlug
Prüfe auf Fehler - guck mal hier:
http://php.net/manual/de/mysqli.query.php
(Bsp 1 weiter unten bei "Prozeduraler Stil")
mit JS DeinInputElemt.onBlur() (oder war es .blur ?)
(ist das Gegenteil von onFocus)
Ich dachte mir gerade "da war doch mal was vor kurzem .." und tada:
ZitatThe UTF-8 Byte Order Mark specifically
Quelle und schoener Post btw: http://stackoverflow.com/questions/8028…nt-error-in-php
Es könnte also ein BOM (Byte Order Mark) am Anfang angehanden (worden)sein.
EDIT: das Thema hatten wir hier: Byte-Order Mark found in UTF-8 File.
falls es mal jemand braucht - hab mir paar Funktionen geschrieben um Scripte einfacher zu lesen/schreiben.
toBit:
Nützlich wenn man zB INSERTs in die db schicken will like:
§sql = "INSERT INTO `db`.`tbl` SET `an_oder_aus` = " . toBit($val) . ";";
// tipp: "an aus" felder können vom typ BIT(1) sein
// INSERT INTO `db`.`tbl` SET `feld_one_bit` = b'0'; -- siehe: http://dev.mysql.com/doc/refman/5.0/en/bit-field-literals.html
Funktion:
function toBit($var, $trim_str=true){
if(function_exists('toBool')){
return (int)toBool($var, $trim_str);
}
(($is_str=is_string($var))and $trim_str)and $var=trim($var);
return (int)(
(
($is_str and ($var === 'false' or $var === 'null'))
or (is_numeric($var)and $var < 1)
) ? false : (bool)$var
);
}
Alles anzeigen
Test:
foreach(
array(
// erwartet, zu prüfen
array('1', true),
array('0', false),
array('0', null),
array('1', 'true'),
array('0', 'false'),
array('0', 'null'),
array('1', ' true '),
array('0', ' false '),
array('0', ' null '),
array('1', 13),
array('1', 1),
array('0', 0),
array('0', -1),
array('1', '13'),
array('1', '1'),
array('0', '0'),
array('0', '-1'),
array('1', 'a string ...'),
) as $arr
){
$expected = $arr[0];
$var = $arr[1];
echo $expected . ' ' . var_export(toBit($var), true) . PHP_EOL;
}
Alles anzeigen
out:
----------------------------------------
toBool:
Nützlich, wenn man den Inhalt einer var als boolean braucht -- klar irgendwie.
Funktion:
function toBool($var, $trim_str=true){
(($is_str=is_string($var))and $trim_str)and $var=trim($var);
return (
($is_str and ($var === 'false' or $var === 'null'))
or (is_numeric($var)and $var < 1)
) ? false : (bool)$var;
}
Test:
foreach(
array(
// erwartet, zu prüfen
array('true', true),
array('false', false),
array('false', null),
array('true', 'true'),
array('false', 'false'),
array('false', 'null'),
array('true', ' true '),
array('false', ' false '),
array('false', ' null '),
array('true', 13),
array('true', 1),
array('false', 0),
array('false', -1),
array('true', '13'),
array('true', '1'),
array('false', '0'),
array('false', '-1'),
array('true', 'a string ...'),
) as $arr
){
$expected = $arr[0];
$var = $arr[1];
echo $expected . ' ' . var_export(toBool($var), true) . PHP_EOL;
}
Alles anzeigen
out:
true true
false false
false false
true true
false false
false false
true true
false false
false false
true true
true true
false false
false false
true true
true true
false false
false false
true true
Alles anzeigen
--------------------------
toStr:
Nützlich, wenn man debuggen muss/will (null wird ja dann zB nicht ausgegeben ect ect)
Funktion:
function toStr($var, $if_type_is=-1, $return_failure='', $cut_str_quotes=true){
$if_type_is !== -1 and $if_type_is=strtolower($if_type_is);
$var_ret = ($cut_str_quotes and ($is_str=is_string($var)))
? substr(var_export($var, true), 1, -1)
: (
($is_res=is_resource($var)) ? get_resource_type($var) : var_export($var, true)
);
if($if_type_is === -1){
return $var_ret;
}
elseif($if_type_is === 'resource'){
return $is_res ? $var_ret : $return_failure;
}
elseif($if_type_is === 'string'){
return $is_str ? $var_ret : $return_failure;
}
elseif(
in_array(
$if_type_is,
array(
'bool',
'null',
'array',
'object',
'float',
'double', // alias float
'real', // alias float
'int',
'integer', // alias int
'long', // alias int
'numeric',
),
true
)
){
return call_user_func_array('is_' . $if_type_is, array($var)) ? $var_ret : $return_failure;
}
return $return_failure;
}
Alles anzeigen
Test:
foreach(
array(
array(1, 2, 3, '4', (object)array('key' => 'val')),
true, false, null,
'true', 'false', 'null',
1, '1',
1.1, '1.1',
1, '1',
PHP_INT_MAX , (string)PHP_INT_MAX,
(object)array(1,2,3),
socket_create(AF_INET, SOCK_STREAM, SOL_TCP),
"a string with 'quotes' and slashed \'quotes\'"
) as $var
){
echo toStr($var) . PHP_EOL;
#echo toStr($var, 'bool', 'ERROR', 1) . PHP_EOL;
#echo toStr($var, 'resource', '', 0) . PHP_EOL;
#var_dump(toStr($var, 'bool', $var));
}
Alles anzeigen
out:
array (
0 => 1,
1 => 2,
2 => 3,
3 => '4',
4 =>
stdClass::__set_state(array(
'key' => 'val',
)),
)
true
false
NULL
true
false
null
1
1
1.100000000000000088817841970012523233890533447265625
1.1
1
1
2147483647
2147483647
stdClass::__set_state(array(
0 => 1,
1 => 2,
2 => 3,
))
Socket
a string with \'quotes\' and slashed \\\'quotes\\\'
Alles anzeigen
Weitere Bsp:
$connection_status = true;
$log_msg = 'connection status is: ' . toStr($connection_status);
echo $log_msg; -- out: connection status is: true
$var = true;
echo toStr($var, 'bool', $var); // to string , wenn bool, sonst var -- out: true
$var = '1';
echo toStr($var, 'bool', $var); // to string , wenn bool, sonst var -- out: 1
$var = null;
echo toStr($var, 'resource'); // to string , wenn resource, sonst [default] '' -- out: ''
$var = '...';
echo toStr($var, 'object', 'is gar kein object'); // to string , wenn object, sonst eigene meldung -- out: 'is gar kein object'
Alles anzeigen
Das geht mit login-paths
siehe; http://dev.mysql.com/doc/mysql-util…ylogin.cnf.html
oder: https://search.oracle.com/search/search?search.timezone=-60&search_startnum=&search_endnum=&num=10&search_dupid=&exttimeout=false&actProfId=0&q=mylogin.cnf&group=MySQL&sw=t&search_p_main_operator=all&search_p_atname=&adn=&search_p_op=equals&search_p_val=&search_p_atname=&adn=&search_p_op=equals&search_p_val=
Der login via console läuft dann in etwa:
Zitatshell> mysql --login-path=local
Via PHP hab musste mal suchen. Habs selbst noch nicht getestet.
EDIT:
wobei Du bedenken musst: sobald sich jemand Zugriff auf Deine Files (config.php zB) verschafft hat,
dann kann er den Login auch wieder auslesen.
Ist auf jeden Fall ne Hürde und Logindaten tauchen nicht in Logfiles auf.
Wenn Du
nutzt, dann kann jeder rein, der eingeloggt ist -- also Admin und User. (Bsp index.php/html)
Adminbereich:
Eigtl würde ich persönlich mit einer Funktion den Benutzer laden
und dann in eine Variable packet -- zB $user oder $current_user.
Dann könntest Du (mit nur einer Query) prüfen:
ist user vom typ "User", oder "Admin", ist er eingeloggt, ...
Ich versuchs mal so:
function isUserLoggedIn($mysqli, $user_type=false) {
if($user_type !== false){
// parameter $user_type wurde übergeben
if($user_type === 'Admin'){
// zusätzliche WHERE bedingung "AND user_type=?" angehängt
$stmt = $mysqli->prepare("SELECT * FROM web_users WHERE user_session=? AND user_type=?");
$stmt->bind_param("ss", session_id(), $user_type);
$stmt->execute();
$stmt->store_result();
return ($stmt->num_rows() === 1); // *1 gekürzt: return (bedingung wahr oder nicht wahr)
}
elseif($user_type === 'User'){
// eigtl genau das gleiche wie bei "Admin" -- nur um es zu verdeutlichen
$stmt = $mysqli->prepare("SELECT * FROM web_users WHERE user_session=? AND user_type=?");
$stmt->bind_param("ss", session_id(), $user_type);
$stmt->execute();
$stmt->store_result();
return ($stmt->num_rows() === 1); // *1 gekürzt: return (bedingung wahr oder nicht wahr)
}
else{
// fehler - falscher/nicht bekannter $user_type übergeben
}
}
else{
// deine abfrage wie bisher
$stmt = $mysqli->prepare("SELECT * FROM web_users WHERE user_session=?");
$stmt->bind_param("s", session_id());
$stmt->execute();
$stmt->store_result();
/*if($stmt->num_rows() === 1) { -- kann man abkürzen *1
return true;
} else {
return false;
} */
return ($stmt->num_rows() === 1); // *1 gekürzt: return (bedingung wahr oder nicht wahr)
}
}
if(isUserLoggedIn($mysqli) === FALSE) {
// nicht eingeloggt
header('Location: login');
}
if(isUserLoggedIn($mysqli, 'User') === FALSE) {
// nicht als "User" eingeloggt
// achtung - hier würdest du den admin ausschließen, denn der ist ja nicht vom user_type "User"
header('Location: login');
}
if(isUserLoggedIn($mysqli, 'Admin') === FALSE) {
// nicht als "Admin" eingeloggt
header('Location: AdminLogin--??????');
}
Alles anzeigen
endlos Scripts (console/shell).
Das kann aber auch bei ner Webseite passieren wenn zB die maximale Packetgröße überschritten ist (riesen INSERTs o.ä.).
Dann sagt der Mysql-Server "nö" (Verbindung geschlossen) (aber kein "tschüss" -- also kein closing frame) und das Script rennt evtl in einen Fatal Error.
Ja
Hab das beim Schreiben vergessen - aber nicht beim Testen ![]()
Beim Test bekam ich durchweg "connected via tcp/ip" o.ä.
Selbst wenn ich den mysql-Server runtergefahren hab und danach eine Query abgefeuert hab (spätestens hier hätte in der PDO ja geschalten werden müssen ~connected = false)
Hab inzw. festgestellt, dass es unzuverlässig ist.
Nutze jetzt (pseudo code):
zu den pws: ok, sieht dann aber aus wie ein md5 hash. Wie gesagt - lies Dir die Posts bei Gelegenheit mal durch. Wir hatten das Thema "password hashen" dort gemeinsam auseinander genommen.
zu user_type enum: naja, mein weiß zB auf Anhieb was da erwartet werden kann.
Später kannst Du dann noch einen TINYINT daraus machen.
`user_type` wäre dann ein Fremdschlüssel auf eine Tabelle `user_types`.
Diese enthält dann
Aber wie gesagt - will Dich damit nicht überrennen.
zu id 17: dann hast Du sicherlich das create-Statement kopiert (copy create-statement oder so) und hattest schon 17 Zeilen drin ![]()
zu Aufruf: nein
Deine Funktion hat einen neuen Parameter bekommen: $user_type
wenn Du 'user' reinschickst, dann "sucht die Query" ja WHERE user_type = ?
Abfrage für admin:
Abfrage für user:
Erneute Änderung:
function isUserLoggedIn($mysqli, $user_type=false) { // NEU: =false
$sql = "SELECT * FROM web_users WHERE user_session=?"; // deine abfrage wie bisher
// wenn parameter $user_type gesetzt ist:
if($user_type !== false){
$sql .= " AND user_type=?";
}
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", session_id());
if($user_type !== false){
$stmt->bind_param("s", $user_type);
}
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows() === 1) {
return true;
} else {
return false;
}
}
Alles anzeigen
jetzt geht auch:
Abfrage für login:
function isUserLoggedIn($mysqli, $user_type) { // NEU: , $user_type
$stmt = $mysqli->prepare("SELECT * FROM web_users WHERE user_session=?
-- NEU:
AND user_type=?
");
$stmt->bind_param("ss", session_id(), $user_type); // NEU: "ss" und , $user_type
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows() === 1) {
return true;
} else {
return false;
}
}
// aufruf:
// isUserLoggedIn($mysqli, 'admin')
// isUserLoggedIn($mysqli, 'user')
Alles anzeigen
Da gibts sicherlich noch Sachen, de Du in paar Wochen/Monaten anders machen wirst =)
Aber ich will Dich jetzt nicht mit Verbesserungsvorschlägen überennen.
Nur kurze Hinweise:
solltest Du ändern in AUTO_INCREMENT=1 anstatt AUTO_INCREMENT=17
Warum:
AUTO_INCREMENT=17 gibt an, dass die fortlaufende id mit 17 beginnt.
Der erste Eintrag hätte also die id 17, anstatt 1.
Wo wir bei der id sind - da gibts keine.
Du kannst sicherlich die user_id als fortlaufende id nutzen:
`user_id` int(10) NOT NULL AUTO_INCREMENT, -- NEU: AUTO_INCREMENT
-- ...
`user_ip` varchar(50) NOT NULL, -- NEU: das komma nicht vergessen
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Du könntest auch den `user_type` auf enum setzen. Der wird ja sicherlich nur admin und user enthalten.
Wichtig für die Sicherheit: Du speicherst Passwörter im Klartext (cleartext) in der db. Das ist ganz schlecht =)
Wenn Du irgendwann Zeit und Lust hast, sie Dir das mal an: Loginpasswort richtig hashen - password_hash() & password_verify()
Laut Doku soll PDO::getAttribute("ATTR_CONNECTION_STATUS") den Verbindungsstatus liefern.
Wenn ich aber in einer Schleife den Status ausgebe, und den Mysql-Server runterfahre ändert sich der Wert nicht.
Bsp: http://php.net/manual/de/pdo.…ribute-examples
Kann das jemand bestätigen?
wie prüft ihr, ob der Server down ist?
Du doppel-Klickst wohl auf die Tabs. Dann schließen die sich bei Scriptly.
Da aber Scriptly nicht mehr weiterentwickelt wird, solltest Du Dir einen anderen Editor suchen.
(Falls Du mit HTML/PHP gerade erst anfängst, dann nutze ruhig Scritply.)
Zum Thema Editoren: Welchen Editor nutzt Ihr?
Du kannst "last modified" aus dem Header lesen.
Wie der Name schon andeutet ist dort das Datum "zuletzt geändert" hinterlegt.
Das könnte aber Probleme geben, wenn Du die Datei änderst.
Ein "erstellt am" Timestamp gibt es per JS glaub ich nicht.
<div id="date"></div>
<script type="text/javascript">
document.getElementById("date").innerHTML = new Date(document.lastModified);
</script>
Wie erstellst Du denn eine neue Datei? Aus einer ~Vorlage.html ?
Du könntest mit einem Script diese Datei einlesen, den Timestamp rein schreiben und dann als ~neu.html schreiben.
Bsp Batch File
(wenn Du .bat Dateien ausführen kannst)
@echo off
REM #### #### #### #### #### #### #### #### #### #### #### ####
REM ### credits: http://stackoverflow.com/a/1194991/3411766 ###
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
set year=%date:~-4%
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
REM #### #### #### #### #### #### #### #### #### #### #### ####
set newfile="C:\...\new.html"
set datetime=Erstellt am: %day%.%month%.%year% %hour%:%min%:%secs%
(
echo ^<!doctype html^>
echo ^<html^>
echo ^<head^>
echo ^<meta charset="utf-8"^>
echo ^<title^>^</title^>
echo ^</head^>
echo ^<body^>
echo ^<div^>%datetime%^</div^>
echo ^</body^>
echo ^</html^>
) > %newfile%
echo done
pause
EXIT
Alles anzeigen
So langsam klingelts ![]()
Mit Deinem Bsp könnte ich aber die Objekte nicht dynamisch in der for-Schleife zuweisen.
Wenn ich richtig verstanden hab
Zitat... outputs [1] because the append method modifies the object on which it is called.
, dann müsste ich:
was ja aber nicht geht ![]()
Stelle fest: mach wohl Sinn die Objekte im gesamten Script dann nur noch über das Array anzusprechen.
this.Btns = [
[
null,
0, // weitere para
0 // weitere para
],
[
null,
0, // weitere para
0 // weitere para
]
];
for(var k in this.Btns){
this.Btns[k][0] = document.createElement("button");
this.Btns[k][0].appendChild(document.createTextNode("aaa"));
document.getElementById("a").appendChild(this.Btns[k][0]);
}
alert(this.Btns[0][0]); // obj button -- OK
alert(this.Btns[1][0]); // obj button -- OK
// im weiteren ablauf ...
given_key = 1;
var test = this.Btns[given_key][0].innerHTML;
alert(test); // "aaa" -- OK
Alles anzeigen
Jetzt weiß ich wenigstens warum das nicht funktionierte
danke =)
EDIT:
zu this.Elem[1] , this.Elem[2]
Das würde funktionieren. Aber die Namen wären später zB
BtnScroll
und
BtnPause
Ich müsste die Namen also als Keys hinterlegen und dyn einsetzen,
was mich wieder dazu bringt gleich das Array Btns zu nutzen ![]()
EDIT²:
Abschließend kann man wohl sagen:
Es ist solange eine Referenz, solange man es modifiziert.
var a = {"key":"value of a"};
var b = a; // was passiert hier intern eigtl? b wird ~vorerst zum pointer auf a?
alert(a.key); // "value of a"
alert(b.key); // "value of a"
b.key = "new value"; // b und a modifiziert!
alert(a.key); // "neue value"
alert(b.key); // "neue value"
b = {"key":"oh oh"}; // überschrieben!
alert(a.key); // "neue value"
alert(b.key); // "oh oh"
Alles anzeigen
Kann man in JS Referenzen bilden?
Mein Problem:
In var C erstelle ich im Bsp 2 vars (Elem1 und Elem2) und setze sie default auf null.
Dann lasse ich eine Schleife laufen, die auf diese vars Objekte setzen soll.
Dabei lege ich die vars in ein Array.
Problem: im Array haben die vars ihr Element bekommen,
in C sind sie allerdings noch null.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="a"></div>
<script type="text/javascript">
var C =
{
Elem1:null,
Elem2:null,
Btns:null,
init:function()
{
this.Btns = [
[
this.Elem1 // hier hätt ich gern die ref
],
[
this.Elem2 // hier hätt ich gern die ref
]
];
for(var k in this.Btns){
this.Btns[k][0] = document.createElement("button");
this.Btns[k][0].appendChild(document.createTextNode("aaa"));
document.getElementById("a").appendChild(this.Btns[k][0]);
}
alert(this.Btns[0][0]); // obj button
alert(this.Btns[1][0]); // obj button
alert(this.Elem1); // null
alert(this.Elem2); // null
}
}
C.init();
</script>
</body>
</html>
Alles anzeigen
Das sind 2 Sachen.
Das eine die Exceptions, das Andere geht über den Errorhandler.
Siehe: http://docs.php.net/manual/de/errorfunc.examples.php
Kurz: Du erstellst eine Function, registrierst diese Function via set_error_handler("meineFunction") (http://docs.php.net/manual/de/function.set-error-handler.php)
und in dieser Function prüfst Du, was da für ein Fehler aufgetreten ist.
Wenn es ein E_RECOVERABLE_ERROR ist, kannst Du (grad nicht ganz sicher) den bool Wert true returnen, damit das Script weiterläuft.
Kann man machen, muss man aber nicht.
Sollte man aber schon mal gemacht haben ![]()
EDIT:
hier mal ein kurzes Bsp
function myErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
$errortype = array (
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
);
if($errno === E_RECOVERABLE_ERROR){
// hier könnte man ne log schreiben oder email senden ect
// und wenn man sicher ist, dass das script trotzdem weiterlaufen darf
// returnt man true
return true;
}
// return false um den php den fehler ~werfen zu lassen
// bei einem fatal error wird das script wie gewohnt beendet
return false;
}
// php ~mitteilen, dass wir unseren eigenen errorhandler nutzen wollen
set_error_handler("myErrorHandler");
// eine function die parameter 1 als array erwartet (type hinting)
function aaa(array $var){
// leer
}
// function mit falschem parameter typ aufrufen
aaa(1);
// wenn der eigene errorhandler false returnt, wird das hier nicht mehr ausgegeben
echo "hier wird NACH dem fehler code ausgeführt";
Alles anzeigen
Zitat(Im Array [gg_ampname] => cc-twin_peaks).
Da haben wir es doch - bl-founation ist also die Value (Wert) in einem Array.
Dann guck Dir aber mal an, was Du gepostet (auch so genutzt?) hast:
If ($results['Toxikk CC']['gg_mapname'] == bl-foundation) // <- das hier sollte wohl "bl-foundation" heißen (string)
{
echo "Foundation",
}
Das eine
bl-foundation // bl minus foundation
das andere
"bl-foundation" // ein String
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.