#1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘

Das war mal wieder grad mal wieder ein Fehler, wie er im Buche steht. Anwendung läuft seit Jahren astrein, aber auf einmal frisst die Tabelle keine neuen Einträge mehr. Als Entwickler sollte einem die Zahl 2147483647 ja bekannt vorkommen. Folgender Ablauf zum reproduzieren:

CREATE TABLE `produkt` 
(
  `artikelnr` int(11) NOT NULL,
  `preis` float NOT NULL,
  PRIMARY KEY (`artikelnr`)
);

Und der Inhalt:

INSERT INTO produkt (artikelnr, preis) VALUES (2147483647, 4.99);
INSERT INTO produkt (artikelnr, preis) VALUES (2147483648, 6.95);

Das zweite insert-Statement liefert: #1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘.

Simple Erklärung:

The number 2,147,483,647 is the maximum value for a 32-bit signed integer in computing.

Den ganzen Post lesen
Veröffentlicht unter Datenbanken, webdev | 7 Kommentare

PHP WTF #3

Und ein neuer WTF-Teil (Teil 1, Teil 2)!

var_dump(1/3 + 4/3 == 5/3);

Ergebnis? false natürlich! Wie auch sonst, wär ja anderenfalls kein WTF. Genaugenommen hat das „Phänomen“ nichts mit PHP zu tun sondern mit Floating Point-Berechnungen und deren Präzision. Trotz allem hat mich der Spaß gerade eine Viertelstunde Debugging-Zeit gekostet, und zwar in C++. Deswegen mal kurz in PHP getestet – mit gleichem Ergebnis.

Und noch einer:

var_dump(19.99 + 19.99 == 49.98); //bool(false)

Richtigstellung: Schande über mein Haupt und danke an Enrico (siehe Kommentar). Grober Rechenfehler meinerseits. Das Ergebnis lautet natürlich nicht 49.98, sondern 39.98, was dann auch zu einem bool(true) führt.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, Quicktips, webdev | 3 Kommentare

fieser Bug in PHP 5.3 [Update]

Man stelle sich folgenden Quellcode in einem Onlinebanking-Formular vor:

<?php
if (!empty($_POST['ueberweisungsbetrag']) && filter_var($_POST['ueberweisungsbetrag'], FILTER_VALIDATE_FLOAT)!==false)
{
    $ueberweisungsbetrag = $_POST['ueberweisungsbetrag'];
}
else
{
    $ueberweisungsbetrag = 0;
}
?>
<input type="text" name="ueberweisungsbetrag" value="<?php echo $ueberweisungsbetrag; ?>" />

Sieht ja eigentlich erstmal ganz vernünftig aus, oder? Validierung des einigegebenen $_POST-Betrags, um dem Benutzer bei einem Fehler das erneute eintippen zu ersparen. Wenn man nun allerdings die verdammt kleine Gleitkommazahl 2.2250738585072011e-308 als Betrag eintippt, hat das den gleichen Effekt wie

while (true) {}

Nämlich: Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/test.php on line 3. Diese ominöse Zahl führt also PHP-intern zu einem verrecken des Scripts.… Den ganzen Post lesen

Veröffentlicht unter php, Security, webdev | 3 Kommentare

Best-of-the-Web 4

Und hier die nächste Runde an interessanten Links.

Den ganzen Post lesen
Veröffentlicht unter php, Javascript, Best of the Web, webdev | 4 Kommentare

Richtige Stelle zum Encoden?

Ich war bisher immer ein Verfechter der „jeglichen Input sofort encoden“-Schiene. Heißt: Bevor ich Benutzereingaben in der Datenbank abspeichere / eine Bestätigungsemail versende etc. werden die Daten encodet (htmlentities oder ähnliches). Nun bin ich auf diesen sehr interessanten Artikel gestoßen (inspiriert durch einen Post zur ungarischen Notation beim phphacker), der folgende Position vertritt:

For example maybe you want to store these user strings in a database somewhere, and it doesn’t make sense to have them stored HTML-encoded in the database, because they might have to go somewhere that is not an HTML page, like to a credit card processing application that will get confused if they are HTML-encoded.

Den ganzen Post lesen
Veröffentlicht unter Security, webdev, misc IT | 8 Kommentare

Überdeckungsorientierte Testverfahren

Unit-Tests sind ja hinreichend bekannt. Die nachfolgend vorgestellten Testverfahren sicher jedoch weniger. Deshalb gibts heut mal einen kleinen Ausflug. Ohne viel Vorgeplänkel stelle ich verschiedene überdeckungsorientierte Testverfahren vor.

Zeilenüberdeckung

Folgender (sinnloser) Code:

function foo($bar)
{
	if ($bar && !$bar)
		return true;
		
	return false;
}

Was fällt auf? Die Funktion kann nie true returnen. Durch einen Test auf Zeilenabdeckung kann also erkannt werden, dass hier irgendwas nicht stimmt, weil die return true; – Zeile niemals erreicht wird. Allerdings (großes allerdings!), würde folgende „Umstellung“ des Codes bereits zu einer 100%igen Zeilenüberdeckung führen:

function foo($bar)
{
	if ($bar && !$bar) return true;
		
	return false;
}

Klasse, oder?… Den ganzen Post lesen

Veröffentlicht unter php, Software Engineering, webdev | 4 Kommentare

Was die Cloud, AJAX, HTML5 und NoSQL gemeinsam haben

Antwort: Alles ist fürchterlich cool und wird von den wenigsten Benutzern dieser Ausdrücke wirklich verstanden.

Ich bin Pionier! 1999 lud ich bereits Bilder auf meine GeoCities „Webseite“ und brachte damit meine Daten in der Cloud unter! AJAX war lange Zeit (und ist vielleicht bei manchen immernoch) ein Synonym für alles, was es im Web an coolen Sachen gibt. AJAX hat jetzt allerdings eine starke Konkurrenz: Das mega-abgefahrene HTML5! Ob bunte CSS-Übergänge, Canvas oder WebWorker: Es ist neu, krass und HTML5 ja sowieso.

So, nachdem das mal gesagt wurde, solls um das eigentliche Thema dieses Posts gehen: NoSQL.

Ich finde die aktuelle Situation ja sehr interessant: Bis vor etwa 2 Wochen war NoSQL noch der Stern am Datenbankhimmel.… Den ganzen Post lesen

Veröffentlicht unter Datenbanken, webdev | 3 Kommentare

PHP Typehinting schon heute

Ein Traum!

function exampleString(string $string) {
    echo "'$string' is a string!\n";
}

function exampleInt(int $int) {
    echo "$int is an int!\n";
}

function exampleFloat(float $float) {
    echo "$float is a float!\n";
}

function exampleBool(bool $bool) {
    var_export($bool);
    echo " is a bool!\n";
}

exampleString("Hello World!"); //'Hello World!' is a string!
exampleInt(1); //1 is an int!
exampleFloat(1.2); //1.2 is a float!
exampleBool(false); //false is a bool!

exampleBool("not really bool");
/*
Catchable fatal error: Argument 1 passed to exampleBool() must be an instance of Bool, string given, called in D:\xampp\htdocs\typehint\example.php on line 23 and defined in D:\xampp\htdocs\typehint\example.php on line 13
*/

Und das alles gibts nicht erst in 3 Jahren sondern bereits heute!… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 2 Kommentare

Objekte werden per Referenz übergeben – oder?

Beim Durchstöbern von Rudi’s PHP Labor bin ich auf diesen interessanten Artikel gestoßen, den ich hier gern nochmal aufwärmen möchte.

Etwas Code zum warmwerden:

<?php
function modify(StdClass $t)
{
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

Und, was kommt raus? Richtig! 321! Schließlich wird eine Referenz des Objekts übergeben. Wenn ich nun aber in der modify-Funktion die Variable, überschreibe…

<?php
function modify(StdClass $t)
{
	$t = new StdClass;
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

… lautet das Ergebnis auf einmal 123! Also doch nicht ganz so referenzig.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | Hinterlasse einen Kommentar

Niemand soll wissen, dass die Webseite mit PHP läuft!

Kleines Easteregg: Einfach mal an eine beliebige URL

?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

anhängen, bei mir sieht das so aus.

Toll, oder? Weiterhin verraten die Response-Headers ungeniert, was los ist:

Wenn in der php.ini nun die Einstellung expose_php = Off getätigt wird, klappt weder das „Easteregg“ mit dem PHP-Bild, noch kriegt man über die Response-Header die PHP-Version mitgeteilt:

Wenn man nun noch die .php Extension „weg-modrewrite-d“, müsst ihr euch nicht mehr schämen, dass ihr PHP verwendet. Außer natürlich, display_errors ist an und offenbart all eure Programmierfehler ;).… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | 3 Kommentare