Und Du weißt nicht, was die Meldung bedeutet, oder ...?
$amount is nicht defniert.
Entweder gar nicht, oder erst nach der Zeile, in der Du $amount nutzen willst.
Oder die Definition von $amount ist durch einem IF (...) umgangen.
Beiträge von cottton
-
-
Achja, zu den 20 Jahren.. Da gibt es sowieso bestimmt schon Technische Implantate die die Problematik der Alters-Sehschwäche vollkommen ausgleichen werden.
iEye -
Na ... hast Du da etwa einfach den Code kopiert und eingefügt? ;D
ZitatMissing argument 2 for kundengruppen_test()
Das 2te Argument (Parameter) für Deine Funktion wurde nicht übergeben.ZitatCall to a member function execute() on a non-object
$stmt schlug wohl fehl (NULL -- kein object).ACHTUNG: hab gerade enn Fehler von mir gefunden:
da ist ein $ zuviel bei limit
Der Code den ich gepostet hab ist so nicht zu gebrauchen. Sind alles Beispiele/Erklärungen.
die Umsetzung musst Du machen.
EDIT uz Deinem EDIT:
Falsch.
Du musst Funktionen verstehen. Sieh Dir den Link an (php-kurs) -- das alles hier zu erklären macht keinen Sinn -- es steht ja alles schon dort =)
EDIT: und/oder dort: https://www.youtube.com/watch?v=t8w18SrkCBc&ab_channel=PHPtutorialDeutsch
(bzw: https://www.youtube.com/user/PHPtutorialDeutsch/search?query=funktionen%3F&ab_channel=PHPtutorialDeutsch) -
Zu Funktionen: http://www.php-kurs.com/funktionen-in-php.htm
Wenn Du außerhalb einen Wert berechnest (zB $amount) und in die Funktion reinschicken möchtest,
dann erweiterst Du die Funktion um:
Wenn $amount nicht immer übergeben wird, sondern auch mal ein default-Wert genutzt wird,
dann:
Hier mal alles in den Kommentaren beschrieben:PHP
Alles anzeigendefine ('LIMIT', 15); // LIMIT ist eine konstante und ist global verfügbar // ist also in der funktion verfügbar -- du kannst sie ausserhalb definieren // oder schickst den wert 15 als parameter rein: // definieren: function kundengruppen_test($mysqli, $limit){...} // aufrufen: $... = kundengruppen_test($mysqli, 15); // das gleiche mit $offset: kannst Du ausserhalb, oder in einer anderen funktion regeln, // und den wert, der genutzt werden soll - den schickst du in die funktion: // bsp funktion: function getOffset($limit){ // parameter limit siehe oben if (isset($_GET['page']) && $_GET['page'] > 1 ) { $offset = (intval($_GET['page']) - 1 ) * $limit; } } $offset = getOffset(15); // KANNST du so machen, musst aber nicht. function kundengruppen_test($mysqli, $limit) { //define ('LIMIT', 15); // siehe oben $sql = "SELECT COUNT(*) AS `amount` FROM kunden_kategorie"; // diesen COUNT kannst du zB auch in eine extra funktion auslagen (wenn du es zB öfter an verschiedenen stellen benötigst) $res = $mysqli->prepare($sql); $res->execute(); $res->bind_result($amount); $res->fetch(); $res->close(); $offset = getOffset($limit); // siehe oben $pages = ceil($amount/$limit); //$stmt = $mysqli->prepare('SELECT `wkk_id`, `wkk_titel`, `wkk_status` FROM kunden_kategorie LIMIT ' . $limit . ' OFFSET ' . $offset); // HINWEIS: limit und offset per platzhalter nutzen. $stmt = $mysqli->prepare( 'SELECT `wkk_id`, `wkk_titel`, `wkk_status` FROM kunden_kategorie LIMIT ? OFFSET ?' // 2 platzhalter ); $stmt->bind_param("ii", $$limit, $offset); // platzhalter als i (integer) -- denn LIMIT '123' schlägt fehl // bind_param("s") platziert die werte per '', "i" nicht. ... siehe http://php.net/manual/de/mysqli-stmt.bind-param.php $stmt->execute(); $stmt->bind_result($wkk_id, $wkk_titel, $wkk_status); $stmt->store_result(); if($stmt->num_rows() > 0) { while ($stmt->fetch()){ $kundengruppen_test[] = array( 'wkk_id' => $wkk_id, 'wkk_titel' => $wkk_titel, 'wkk_status' => $wkk_status ); } return $kundengruppen_test; } }EDIT:
hatten wir das hier nicht schon mal?
Du siehst schon am code-Highlight, dass die " nicht stimmen =) -
Sieht nach Zugriffsberechtigung aus.
Guck mal hier rein: http://stackoverflow.com/questions/1846…e-allowed-pathszu open_basedir: http://www.php.net/manual/en/ini.core.php#ini.open-basedir
ZitatWhen the file is outside the specified directory-tree, PHP will refuse to access it.
Wenn Du einen neuen Server aufgesetzt hast, fehlen evtl die Einstellungen, oder Du hast etwas vergessen (slash / am Ende), ...
ZitatThe restriction specified with open_basedir is a directory name since PHP 5.2.16 and 5.3.4. Previous versions used it as a prefix. This means that "open_basedir = /dir/incl" also allowed access to "/dir/include" and "/dir/incls" if they exist. When you want to restrict access to only the specified directory, end with a slash. For example: open_basedir = /dir/incl/
Das Programm kenne ich nicht. Keine Ahnung wo und was Du einrichten musst.
Wird aber sicherlich nur eine Einstellungssache sein.Guck auch mal hier rein: "You can set open_basedir in ..." http://stackoverflow.com/a/13291257/3411766
EDIT: wenn es ums aktive Umschreiben o.ä. geht, dann was wolf sagt

-
Am besten über die URL.
Bsp;
Hauptmenu link "Bilder" ausgewählt -> link: domain.de/?menu=bilder
in Bildermenu das Untermenu "Urlaub" ausgewählt -> link: domain.de/?menu=bilder&submenu=urlaubmenu kann auch ?m= sein und das Submenu &sm=
( domain.de/?m=bilder&sm=urlaub )
... wie Du möchtest.Für alles Weitere musst Du schon irgend ein Code geben (was Du bis jetzt hast) =)
-
Vor-Nachteile -- kommt immer drauf an, wie Deine Tabellen aussehen.
Einfach testen, ausprobieren, anpassen usw.
Die schnellste Variante gewinnt dann =)Die Zweite allerdings ist etwas "schwierig". Kann zu falschen Ergebnissen führen.
Und das ist mir hier sogar passiert
Mit dem join bekommt man falsche Ergebnisse.
Warum:
zähle tbl a und zähle tbl b
von tbl a
left join tbl bkommt raus:
wenn in tbl a NICHT gefunden,
aber über tbl b,
dann "bekommt" tbl a einen count up (also +1).Also nicht die 2te Variante nutzen =)
-
Den Fehler
ZitatCall to a member function bind_param() on a non-object
bekommst Du, weil $stmt = $mysqli->prepare sichrlich fehlschlug.
(Fehlermeldungen abfangen!)Zur Query:
eine Möglichkeit:SQLSELECT (SELECT COUNT(*) FROM `kunden` WHERE `kd_telefon` = ?) + (SELECT COUNT(*) FROM `kunden_weitere_telefonnummern` WHERE `uwt_nummer` = ?) AS `amount`;
andere Möglichkeit:SQL-- EDIT: falsch! nicht nutzen! SELECT COUNT(`a`.`kd_telefon`) AS `amount_a`, COUNT(`b`.`uwt_nummer`) AS `amount_b` FROM `kunden` AS `a` LEFT JOIN `kunden_weitere_telefonnummern` AS `b` ON `a`.`kd_telefon` = `b`.`uwt_nummer` WHERE `a`.`kd_telefon` = ? OR `b`.`uwt_nummer` = ?;
Warum hast Du egtl die Nummern in 2 Tabellen?
Wenn Du "mehr Platz" für mehr Nummern brauchst, dann würde ich generell eine Extratabelle empfehlen.Code
Alles anzeigentabelle kunden: id primary key auto increment id |name |... |... -------------------- 1 |hans |... |... 2 |klaus |... |... tabelle kunden_tel id primary key auto increment kunden_id [fremdschlüssel wenn du kannst] unique index für id + kunden_id id |kunden_id |bezeichnung |tel |... ------------------- 1 |1 |firma |55512 2 |1 |zu hause |23424 3 |1 |mobil |324242 4 |2 |firma |4234223 -
hab da nen Fehler bei DEINE_MAX_LEN_,
sollte natürlich MIN Länge sein. Wirst Du aber sicherlich mitbekommen haben
Und beiZitatoder `user` ist INDEX UNIQUE oder PRIMARY KEY
-- vergiss den PRIMARY KEY. PRIMARY KEY sollte ein Feld vom Type INT sein (AUTO_INCREMENT).
Das Feld `user` mit dem Namen setzt Du dann einfach auf einen unique index, damit es nur einmal vorkommen darf. -
Was meinst Du mit const für password_hash()?
Meinst Du PASSWORD_DEFAULT ?hier mal ein "paar" Hinweise
... ich übertreibe gern
PHP
Alles anzeigen<?php if(isset($_POST['user'])) // sollte $_POST['senden'] sein { $user = trim($_POST['user']); $pw = trim($_POST['password']); /* nie nie niemals das vom nutzer eingegebene pw verändern. die sparkasse zB kürzt ungefragt und ohne hinweis eingegebene pws auf die max länge - und das ist absolute falsch. hier ist es zwar nur trim(), wenn user aber ein leerzeichen am anfang oder ende verwenden will - sol er doch - du speicherst ja einen hash des pws. und dem hash ist das leerzeichen auch egal. */ $pnr = trim($_POST['personalnummer']); if(!empty($user) && !empty($pw) && !empty($pnr)) /* empty ist "schwammig" wenn nutzer "0" eingibt, dann ist $user empty wenn er aber (nur) "1" eingibt (oder "a" oder "," ...), dann ist es nicht empty, aber wohl sicherlich zu kurz besser wären einzellne prüfungen wie in etwa if(strlen($user) < DEINE_MAX_LEN_USER){ ... fehler ..} if(strlen($pw) < DEINE_MAX_LEN_PW){ ... fehler ..} // kein elseif, denn dann würdest du nur immer einen fall prüfen if(strlen($pw) < DEINE_MAX_LEN_PNR){ ... fehler ..} // kein elseif, denn dann würdest du nur immer einen fall prüfen UND auch max länge prüfen. sonst könnte es passieren, dass: - du einen user von 255 länge in die db schickst - du ein sehr sehr langes pw in password_hash() gibts (gibt auch eine max len für die function) */ { $pnr = filter_var($pnr, FILTER_VALIDATE_INT); /* geht einfacher: if((int)$pnr != $pnr){ fehler} erklärung: (int)$pnr ^= den wert von $pnr als integer zurückgeben (INFO: $_POST und $_GET kommen immer als string - auch zahlen) != ^= einfacher vergleich wenn also $pnr ein string "1" ist dann ist (int)$pnr != $pnr false, denn (int)"1" != "1" enspricht 1 != "1" ergibt false. anders herum: 1 == "1" ergibt true. nächstes if kann man also so schreiben: if(ctype_alnum($user) and (int)$pnr == $pnr){ $pnr = (int)$pnr; // ... } */ if(ctype_alnum($user) && $pnr !== false) { include "inc/verbindung.inc.php"; /* würde require oder require_once nutzen. denn wenn include fehlschlägt, dann geht es weiter im script, was ja offensichtlich nicht funktionieren wird */ $insert = $verbindung->prepare("INSERT INTO account (user, password, personalnummer) VALUES (?, ?, ?)"); /* ; nicht vergessen. ist kein "muss", kann aber evtl injections verhindern ... oder schusselfehler ect würde auch `field` empfehlen. INSERT INTO `datenbank`.`account` (`user`, `password`, `personalnummer`) VALUES (?, ?, ?) BTW: was, wenn der datensatz schon existiert? 2 moglichkeiten: - vorhergehendes SELECT COUNT(*) FROM `datenbank`.`account` WHERE `user` = ? ... -- evtl pnr prüfen? ... - oder `user` ist INDEX UNIQUE oder PRIMARY KEY - dann gibts nen fehler beim insert -- duplicate key */ $insert->bindValue(1, $user); $insert->bindValue(2, password_hash($pw, PASSWORD_DEFAULT)); /* erst hashen, und wenn nicht false, dann weiter im script. sonst fehler meldung. $pw_hash = password_hash($pw, PASSWORD_DEFAULT); if($pw_hash !== false){ ... weiter im script} */ $insert->bindValue(3, $pnr); /* BTW: http://php.net/manual/de/pdostatement.bindvalue.php user ist immer ein string. also: $insert->bindValue(1, $user, PDO::PARAM_STR); pw is auch ein string $insert->bindValue(2, $pw_hash, PDO::PARAM_STR); und pnr ist ein int $insert->bindValue(3, $pnr, PDO::PARAM_INT); */ if($insert->execute()) echo "Der Datensatz wurde hinzugefügt!"; else print_r($insert->errorInfo()); /* nicht schön. was spricht gegen klammern? =) */ } else { // klammern? // und kein elseif -- dann bekommt nutzer alle fehler, und nicht nur den ersten auftretenden =) // und siehe oben: if((int)$pnr != $pnr){ fehler } if(!ctype_alnum($user) && $pnr === false) echo "Der Benutzername ist nicht Korrekt. Ebenso darf die Personalnummer nur Zahlen enthalten"; else if(!ctype_alnum($user)) echo "Der Benutzername ist nicht Korrekt"; else if($pnr === false) echo "Die Personalnummer darf nur Zahlen enthalten"; } } else // KLAMMERN nutzen! ist kein gesetz, aber klammern nicht zu benutzen ist nicht cool, es ist einfach nur anfälliger für schusselfehler =) echo "Bitte alle Pflichtfelder ausfüllen"; } ?> <form action="<?php $_SERVER['SCRIPT_NAME'] ?>" method="POST"> <!-- action="" tuts auch --> <p><input name="user" placeholder="Username"></p> <p><input name="password" type="password" placeholder="Passwort"></p> <p><input name="personalnummer" placeholder="Personalnummer"></p> <p><input type="submit" value="Login" name="senden"></p> </form> <style> input { margin:2em auto; width:45%; padding:2%; border:1px solid #ccc; font-family:helvetica; color:#444 } </style> <? -
man kann es natürlich auch verwenden, um code einzuschleusen ...
ich denke zwar nicht, dass Du das vorhast (was in dem String steckt sieht nicht "gefährlich" aus),
wenn aber doch, dann kannst Du vergessen, dass hier jemand hilft
-
Ja, wegen CSS -- halt ich mich raus

Zwecks JS -- Du wirst ja sicherlich noch mehr mit dem bot machen wollen.
Hab Dir das JS mal einfacher dargestellt: Post Fernsteuerung eines Raspberry Pi über HTML-Seite
runter scrollen zu "js abgeändert -- etwas vereinfacht:" -
Ich glaube Du hast Da etwas falsch verstanden - zwecks php-Dateien includen.
Hab mir mal angesehen, was in dem String drin steckt - das ist ja wieder php , html und sql OO?
Warum? Warum encodest Du ganze Dateien? -
Hast den Fehler aufm PC oder Smartphone?
Die Meldung deutet darauf hin, dass der Server die Verbindung verweigert.
code 1006:Zitat von https://tools.ietf.org/html/rfc6455that the
connection was closed abnormally, e.g., without sending or
receiving a Close control frame.
Kann man das Server-Script irgendwo einsehen?EDIT: hab script oben editiert:
von
zu
hatte /ws weggelassen. Glaube zwar nicht, dass der Server das prüft, kann ja aber sein ...
(bin Nachmittags wieder online) -
Cool. Das hat geholfen.
Es war nicht ganz mittig. Habs dann noch angepasst: https://jsfiddle.net/ff2ox3vy/
Und jetzt kann Content davor und danach "normal" dargestellt werden. -
Ich denk auch, dass wir da ein bissl code brauchen.
Wird wohl um ein onclick event gehen. Und das event soll dann von dem Banner den Tag nehmen (der sich sicherlich öfter ändert) und in eine url einfügen.
Aber ohne code können wir nicht mal ansatzweise helfen
-
Das Scipt ist "Mist". (Sieht auch zusammen-kopiert aus)
Bei jedem Klick baut es eine neue Verbindung auf.
Kann mir vorstellen, dass aufm mobilen Browser Probleme macht.
Hast Du eine Alternative?EDIT:
probier mal das hier:HTML
Alles anzeigen<!DOCTYPE html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta charset="utf-8" /> <title>title</title> <style type="text/css"> *{ margin: 0; padding: 0; } html{ height: 100%; } #wrap{ width: 100%; height: 300px; position: relative; display: flex; align-items: center; justify-content: center; } #wrap > button{ width: 100px; height: 100px; display: block; position: absolute; left: calc(50% - 50px); top: calc(50% - 50px); } #wrap > button:nth-child(1){ transform: translateX(-100px); } #wrap > button:nth-child(2){ transform: translateY(-100px); } #wrap > button:nth-child(3){ transform: translateX(100px); } #wrap > button:nth-child(4){ transform: translateY(100px); } </style> <script type="text/javascript"> // set global var socket var socket, connected; // check if Websocket is supported by current browser if(!window.WebSocket){ debug("your browser does not support WebSocket"); } // debug function function debug(str){ document.getElementById("debug").innerHTML += str + "<br>"; } // start function - on submit host function start(){ if(!connected){ wsConnect(document.getElementById("data").value); } else{ debug("already connected"); } } // connect to ws server function wsConnect(host){ try{ socket = new WebSocket("ws://" + host + ":9093/ws"); connected = true; wsPrepare(); } catch(e){ debug("unable to connect: " + e); } } // set ws events function wsPrepare(){ socket.onopen = function(ev){ debug("connected"); }; socket.onmessage = function(ev){ debug("received message: " + ev.data); }; socket.onerror = function(ev){ var emsg = (ev && ev.data) ? ev.data : "unknown"; debug("error: " + emsg); }; socket.onclose = function(ev){ connected = false; debug("disonnected! [#" + ev.code + (ev.reason ? " " + ev.reason : "") + "]"); }; } // button controlls // defines a variable that controls the forward movement function accelerate(){ if(!connected){ debug("not connected"); return; } socket.send("u"); debug("sent: u"); } // defines a variable that controls the backward movement function reverse(){ if(!connected){ debug("not connected"); return; } socket.send("d"); debug("sent: d"); } // defines a variable that controls the left movement function steer_left(){ if(!connected){ debug("not connected"); return; } socket.send("l"); debug("sent: l"); } // defines a variable that controls the right movement function steer_right(){ if(!connected){ debug("not connected"); return; } socket.send("r"); debug("sent: r"); } // defines a variable that stops the robot function stop(){ if(!connected){ debug("not connected"); return; } socket.send("b"); debug("sent: b"); } // key controlls document.addEventListener( "keyup", function(event){ if(!connected){ return; } var KeyID = event.keyCode; switch(KeyID){ case 16: socket.send("b"); debug("sent: b"); break; case 17: socket.send("b"); debug("sent: b"); break; case 37: socket.send("l"); debug("sent: l"); break; case 38: socket.send("u"); debug("sent: u"); break; case 39: socket.send("r"); debug("sent: r"); break; case 40: socket.send("d"); debug("sent: d"); break; } } ); </script> </head> <body> <div><b>Instructions for keyboard controls:</b></div> <div>Press Up arrow key - Acceleraate</div> <div>Press Down arrow key - Reverse</div> <div>Press Right arrow key - Steer Right</div> <div>Press Left arrow key - Steer Left</div> <div>Press cltr/shift key to Stop</div> <div><b>Enter the hostname/ip address to make the websocket connection</b></div> <input type="text" id="data" size="25" value="" /> <input type="button" value="clickme" onclick="start()" /> <div id="wrap"> <button class="touch left" onclick="steer_left()">Steer Left</button> <button class="touch top" onclick="accelerate()">Accelerate</button> <button class="touch middle" onclick="stop()">Stop</button> <button class="touch bottom" onclick="reverse()">Reverse</button> <button class="touch right" onclick="steer_right()">Steer Right</button> </div> <div id="debug"><b>debug:</b><br></div> </body> </html>BTW: hab mich gerade wiedermal mit css geärgert - wir könn uns gegenseitig echt nicht ausstehen

Hat jemand ne idee, wie man die Buttons immer schön mittig platziert? Aber trotzdem als Kreuz?
Hatte das mit position relative probiert, aber irgendwie .. naja.EDIT: updated buttons
EDIT:
js abgeändert -- etwas vereinfacht:HTML
Alles anzeigen<!DOCTYPE html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta charset="utf-8" /> <title>title</title> <style type="text/css"> *{ margin: 0; padding: 0; } html{ height: 100%; } #wrap{ width: 100%; height: 300px; position: relative; display: flex; align-items: center; justify-content: center; } #wrap > button{ width: 100px; height: 100px; display: block; position: absolute; left: calc(50% - 50px); top: calc(50% - 50px); } #wrap > button:nth-child(1){ transform: translateX(-100px); } #wrap > button:nth-child(2){ transform: translateY(-100px); } #wrap > button:nth-child(3){ transform: translateX(100px); } #wrap > button:nth-child(4){ transform: translateY(100px); } </style> <script type="text/javascript"> // set global vars: var socket, // WebSocket connected; // bool // check if Websocket is supported by current browser if(!window.WebSocket){ debug("your browser does not support WebSocket"); } // debug function function debug(str){ document.getElementById("debug").innerHTML += str + "<br>"; } // start function - on submit host function start(){ if(!connected){ wsConnect(document.getElementById("data").value); } else{ debug("already connected"); } } // connect to ws server function wsConnect(host){ try{ socket = new WebSocket("ws://" + host + ":9093/ws"); connected = true; wsPrepare(); // call wsPrepare() to define the websocket events } catch(e){ debug("unable to connect: " + e); } } // set ws events function wsPrepare(){ socket.onopen = function(ev){ debug("connected"); }; socket.onmessage = function(ev){ debug("received message: " + ev.data); }; socket.onerror = function(ev){ var emsg = (ev && ev.data) ? ev.data : "unknown"; debug("error: " + emsg); }; socket.onclose = function(ev){ connected = false; debug("disonnected! [#" + ev.code + (ev.reason ? " " + ev.reason : "") + "]"); }; } // function that sends the movement commands to server by type function movement(type){ if(!connected){ debug("not connected"); // need to connect first return; } var str = null; // string to send if(type === 16 || type === 17){ // keys "shift" or "ctrl" str = "b"; // stops the robot } else if(type === 37){ // key "left arrow" str = "l"; // controls the left movement } else if(type === 38){ // key "up arrow" str = "u"; // controls the forward movement } else if(type === 39){ // key "right arrow" str = "r"; // controls the right movement } else if(type === 40){ // key "down arrow" str = "d"; // controls the backward movement } if(str !== null){ socket.send(str); debug("sent: " + str); } else{ debug("unknown movement type '" + type + "'"); } return; } // add event listener document.addEventListener( "keyup", // on key up function(event){ if(!connected){ // need to connect first return; } movement(event.keyCode); // call movement function } ); </script> </head> <body> <div><b>Instructions for keyboard controls:</b></div> <div>Press Up arrow key - Acceleraate</div> <div>Press Down arrow key - Reverse</div> <div>Press Right arrow key - Steer Right</div> <div>Press Left arrow key - Steer Left</div> <div>Press cltr/shift key to Stop</div> <div><b>Enter the hostname/ip address to make the websocket connection</b></div> <input type="text" id="data" size="25" value="" /> <input type="button" value="clickme" onclick="start()" /> <div id="wrap"> <button class="touch left" onclick="movement(37)">Steer Left</button> <button class="touch top" onclick="movement(38)">Accelerate</button> <button class="touch middle" onclick="movement(16)">Stop</button> <button class="touch bottom" onclick="movement(40)">Reverse</button> <button class="touch right" onclick="movement(39)">Steer Right</button> </div> <div id="debug"><b>debug:</b><br></div> </body> </html> -
Im Script "fehlt" ein onerror() event.
ergänze mal das Folgende:JavaScript
Alles anzeigen... socket.onmessage = function(msg) { showServerResponse(msg.data); } socket.onclose = function() { //alert("connection closed...."); showServerResponse("The connection has been closed."); } // ab hier neu socket.onerror= function(ev) { alert(ev.data); } // bis hier neu ...
Dann versuch das ganze nochmal. Evtl tritt ein Fehler auf, der Dir ja so sonst entgeht.
Ansonsten was kanu sagt.EDIT: evtl wurde auch in der console (Browser) geloggt:
falls die Verbindung nicht zustande kam. -
Wir hatten gestern ne Frage zum Thumbnails erstellen ...
hatte lange weile ...
free use/change/w/ePHP
Alles anzeigen<?php function ratioResize(array $src_size, array $dst_size=array(), $round_int=true){ /* parameter: $src_size: (array) source size array(0 => (int){width}, 1 => (int){height}) $dst_size: (array) destination size array(0 => (int){width}, 1 => (int){height}) $round_int: (bool) round width and height returns: success: array((numeric)$dst_width, (numeric)$dst_height) failure: false */ if(!isset($src_size[0])or !isset($src_size[1])){ return false; } $dst_width = (float)isset($dst_size[0]) ? $dst_size[0] : $src_size[0]; $dst_height = (float)isset($dst_size[1]) ? $dst_size[1] : $src_size[1]; if($src_size[0] <> $dst_width or $src_size[1] <> $dst_height){ $src_ratio = ((float)$src_size[0] > 0) ? $src_size[0] / $src_size[1] : 0; if(((float)$dst_width > 0 ? $dst_width / $dst_height : 0) > $src_ratio){ $dst_width = $dst_height * $src_ratio; }else{ $dst_height = ((float)$dst_width > 0) ? $dst_width / $src_ratio : 0; } } if($round_int === true){ $dst_width = round($dst_width); $dst_height = round($dst_height); } return array($dst_width, $dst_height); } function getValidFilenameFrom($filename){ return preg_replace('/[^a-zA-Z0-9_]/', '_', $filename); } function resizeImage($src_file, array $dst, array $dst_size=array(), &$ecode=null, &$emsgs=null) { /* parameter: $src_file: (string) source path + filename -- path/path/filename.extension $dst: (array) destination array( 0 => (string){path}, 1 => (string){name}, 2 => (string){format 'png', 'jpeg', 'gif' or 'wbmp'} ) $dst_size: (array) resize image to array(0 => (int){width}, 1 => (int){height}) &$ecode: (int) error code &$emsgs: (string) error message returns: (bool) */ // check source file $src_file = (string)$src_file; if(!file_exists($src_file)){ $ecode = 10; $emsgs = 'source filename "' . $src_file . '" does not exist'; return false; } if(!is_file($src_file)){ $ecode = 11; $emsgs = 'source filename "' . $src_file . '" is not a file'; return false; } if(!is_readable($src_file)){ $ecode = 12; $emsgs = 'source filename "' . $src_file . '" is not readable'; return false; } // check destination path $dst_path = (string)$dst[0]; if(strlen($dst_path) > 0){ $dst_path = str_replace(array('/', '\\'), array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), (string)$dst_path); if(substr($dst_path, -1) !== DIRECTORY_SEPARATOR){ $dst_path .= DIRECTORY_SEPARATOR; } } if(!file_exists($dst_path)){ $ecode = 20; $emsgs = 'destination path "' . $dst_path . '" does not exist'; return false; } if(!is_dir($dst_path)){ $ecode = 21; $emsgs = 'destination path "' . $dst_path . '" is not a directory'; return false; } if(!is_readable($dst_path)){ $ecode = 22; $emsgs = 'destination path "' . $dst_path . '" is not readable'; return false; } // check destination filename $dst_name = (string)$dst[1]; if($dst_name !== getValidFilenameFrom($dst_name)){ $ecode = 30; $emsgs = 'invalid destination filename "' . $dst_name . '"'; return false; } if(strlen($dst_name) < 1){ $ecode = 31; $emsgs = 'destination filename cannot be empty'; return false; } // check destination format (plus set callable $call) $dst_format = strtolower((string)$dst[2]); if($dst_format === 'png'){ $call = 'imagepng'; } elseif($dst_format === 'jpeg'){ $call = 'imagejpeg'; } elseif($dst_format === 'gif'){ $call = 'imagegif'; } elseif($dst_format === 'wbmp'){ $call = 'imagewbmp'; } else{ // wrong format given $ecode = 40; $emsgs = 'invalid destination format "' . $dst_format . '"'; return false; } // prepare destination size $dst_size = array( isset($dst_size[0]) ? $dst_size[0] : null, isset($dst_size[1]) ? $dst_size[1] : null, ); // get source image raw data if(($src_raw=file_get_contents($src_file)) === false){ // unable to read source $ecode = 100; $emsgs = 'unable to read source filename "' . $src_file . '"'; return false; } // create new image from source if(($src_image=imagecreatefromstring($src_raw)) === false){ // must be something else than a picture $ecode = 101; $emsgs = 'destination filename "' . $src_file . '" is not an image'; return false; } // get current size $src_size = getimagesize($src_file); // get new size $dst_size = ratioResize($src_size, $dst_size, false); // create new image if(($dst_image=imagecreatetruecolor($dst_size[0], $dst_size[1])) === false){ $ecode = 102; $emsgs = 'unable to create new true color image'; return false; } // transparency if(imagesavealpha($dst_image, true) === false){ $ecode = 103; $emsgs = 'unable to set flag to save full alpha channel information'; return false; } if(($transparency = imagecolorallocatealpha($dst_image, 0, 0, 0, 127)) === false){ $ecode = 104; $emsgs = 'unable to allocate a color for an image'; return false; } imagefill($dst_image, 0, 0, $transparency); // copy and resize if( imagecopyresampled( $dst_image, $src_image, 0, 0, 0, 0, $dst_size[0], $dst_size[1], $src_size[0], $src_size[1] ) === false ){ $ecode = 105; $emsgs = 'unable to copy and resize image'; return false; } // write if(call_user_func_array($call, array($dst_image, $dst_path . $dst_name . '.' . $dst_format)) === false){ // unable to write file $ecode = 106; $emsgs = 'unable to write image to destination'; return false; } imagedestroy($src_image); imagedestroy($dst_image); return true; } // example: $source_image = 'path/path\\path/orig_img.jpg'; // a valid path + filename $destination_path = 'path/path'; // a valid path $destination_filename = 'myNewImage_1'; // a valid filename $destination_format = 'png'; // 'png', 'jpeg', 'gif' or 'wbmp' $destination_size_width = 50; // numeric $destination_size_height = 50; // numeric $ecode = null; // gets changed by ref on error $emsgs = null; // gets changed by ref on error $result = resizeImage( $source_image, array($destination_path, $destination_filename, $destination_format), array($destination_size_width, $destination_size_height), $ecode, $emsgs ); if($result === false){ echo 'ERROR: ' . $emsgs . ' [ecode ' . $ecode . ']'; } else{ echo 'OK'; } ?> -
paar Schnitzer drin.
(vorweg: bin müde
)PHP
Alles anzeigenforeach ($bilderdateinamen AS $dateiname ) { if(($original=imagecreatefromstring( file_get_contents($dateiname) )) === false){ // empfehlung: ist es false, dann war es kein bild (zwecks sicherheit) // err msg ... } //$i = 0; brachen wir hier nicht =) demm $bilderdateinamen[$i] === $dateiname if(($bild=ImageCreateTrueColor(200, 150)) === false){ //Neues Bild erstellen mit Maßen 200*150 // ^ evtl die proportionen beibehalten, sonst bild verzerrt } $thumbname = substr($dateiname, 0, -4)."-thumbnail.jpg"; //Bennennung des thumbnails $imagesize = getimagesize($dateiname); //Ermittlung der Bildgröße des Originalbildes // erst copy/resize, dann spreichern // $bild und $original, du hattest ...."-thumbnail.jpg" (string) genutzt imagecopyresized ($bild , $original , 0 , 0 , 0 , 0 , 200, 150 , $imagesize[0] , $imagesize[1]); imagejpeg($bild, $thumbname); //Speichern des alten Bildes im Thumbnail und ändern der Größe auf 200*150 imagedestroy($images_orig); // gibt den durch das Bild im belegten Speicher wieder frei echo '<img src="'.$thumbname.'"/><br />'; //Ausgabe des Thumbnail //$i++; brachen wir hier nicht =) }