URL: https://www.overclockers.at/coding-stuff/php-mysql-problem-mit-prepared-statement_251401/page_1 - zur Vollversion wechseln!
folgender Code funktioniert:
Code: PHPtry { $stmt = $db->prepare("SELECT time, preis FROM `tabelle` WHERE id=$id"); } catch (PDOException $e) { echo 'Prepare failed: ' . $e->getMessage(); } try { $stmt->execute(); } catch (PDOException $e) { echo 'Execution failed: ' . $e->getMessage(); }
Code: PHPtry { $stmt = $db->prepare("SELECT time, preis FROM `tabelle` WHERE id=:id"); } catch (PDOException $e) { echo 'Prepare failed: ' . $e->getMessage(); } try { $stmt->bindValue(':id', $id); } catch (PDOException $e) { echo 'BindParam failed: ' . $e->getMessage(); } try { $stmt->execute(); } catch (PDOException $e) { echo 'Execution failed: ' . $e->getMessage(); }
versuch mal:
Code: PHPtry { $stmt = $db->prepare("SELECT time, preis FROM `tabelle` WHERE id = ?"); } catch (PDOException $e) { echo 'Prepare failed: ' . $e->getMessage(); } try { $stmt->execute(array($id)); } catch (PDOException $e) { echo 'Execution failed: ' . $e->getMessage(); }
Danke für die Infos. Ich bin auch kein Programmierer, sondern mach das nur spaßhalber. Da freut man sich über Tips.
Deine Änderung funktioniert leider auch nicht.
PDO hab ich eigentlich nur gewählt, weil ich nicht wußte was ich nehmen soll und ich so theoretisch auf eine andere DB wechseln könnte. (was so wahrscheinlich ist, wie dass ich einen Galera Cluster nutzen werde) Aber vielleicht wechsel ich auf mysql_nd, der Aufwand ist gering.
Es handelt sich nur ein kleines privates Projekt. Ich lese den Spritpreisrechner für ein paar Positionen aus, um die für mich günstigste Tankstelle auf einen Blick zu haben und um den Preisverlauf zu sehen.
Derzeit gibt es 2 Tabellen:
Code: SQL-- -- Tabellenstruktur für Tabelle `spritpreis` -- CREATE TABLE `spritpreis` ( `id` binary(20) NOT NULL, `time` int(10) UNSIGNED NOT NULL, `preis` float UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `tankstelle` -- CREATE TABLE `tankstelle` ( `id` binary(20) NOT NULL, `longitude` float NOT NULL, `latitude` float NOT NULL, `name` tinytext NOT NULL, `adresse` tinytext NOT NULL, `plz` smallint(5) UNSIGNED NOT NULL, `ort` tinytext NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Indizes der exportierten Tabellen -- -- -- Indizes für die Tabelle `spritpreis` -- ALTER TABLE `spritpreis` ADD PRIMARY KEY (`id`,`time`); -- -- Indizes für die Tabelle `tankstelle` -- ALTER TABLE `tankstelle` ADD PRIMARY KEY (`id`);
Code: PHP$id = sha1($result->longitude . '-' . $result->latitude, TRUE)
Code: PHP$stmt1 = $db->prepare("INSERT INTO spritpreis (id, time, preis) VALUES (:id, :time, :preis)"); $stmt2 = $db->prepare("INSERT INTO tankstelle (id, longitude, latitude, name, adresse, plz, ort) VALUES (:id, :longitude, :latitude, :name, :adresse, :plz, :ort) ON DUPLICATE KEY UPDATE id=:id");
Bezüglich mysql_nd. Wenn ich das PHP Manual richtig verstehe, ist mysql_nd eine Library und und kein Client und kann mit mysqli oder PDO verwendet werden und von mir als Benutzer der DB auch nicht verändert werden. Meinst du dass ich eher mysqli verwenden soll?
edit: ich habe die Problemstelle durch ein normales ->query ersetzt. Prepared Statement ist da wirklich nicht notwendig, weil sowieso nur eine einzige id abgefragt wird. Über Tips zum DB Aufbau würde ich mich dennoch freuen.
Du hast Recht, der mysql_nd ist nur der Treiber und dieser kann auf beide Arten verwendet werden. Mysqli ist nur meistens einfacher...
Ich würde die Tabellen so aufbauen:
Dies macht die Tabellen deutlich schneller und kleiner.Code: SQLCREATE TABLE `tankstelle` ( `id` int unsigned NOT NULL auto_increment, `longitude` float NOT NULL, `latitude` float NOT NULL, `name` varchar(30) NOT NULL, `adresse` varchar(30) NOT NULL, `plz` smallint(5) UNSIGNED NOT NULL, `ort` varchar(30) NOT NULL. PRIMARY KEY (`id`), UNIQUE KEY `longlat` (`longitude`,`latitude`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `spritpreis` ( `id` int unsigned NOT NULL, `time` int(10) UNSIGNED NOT NULL, `preis` DECIMAL(6,3) UNSIGNED NOT NULL, PRIMARY KEY (`id`,`time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sollte wohl eher sein:Code: SQLINSERT INTO tankstelle (id, longitude, latitude, name, adresse, plz, ort) VALUES (:id, :longitude, :latitude, :name, :adresse, :plz, :ort) ON DUPLICATE KEY UPDATE id=:id
Code: SQLINSERT INTO tankstelle (id, longitude, latitude, name, adresse, plz, ort) VALUES (:id, :longitude, :latitude, :name, :adresse, :plz, :ort) ON DUPLICATE KEY UPDATE name=:name, adresse=:adresse, plz=:plz, ort=:ort
Danke für deine Ausführungen.
Zitat aus einem Post von Crash OverrideDu hast Recht, der mysql_nd ist nur der Treiber und dieser kann auf beide Arten verwendet werden. Mysqli ist nur meistens einfacher...
Ich würde die Tabellen so aufbauen:Dies macht die Tabellen deutlich schneller und kleiner.Code: SQLCREATE TABLE `tankstelle` ( `id` int unsigned NOT NULL auto_increment, `longitude` float NOT NULL, `latitude` float NOT NULL, `name` varchar(30) NOT NULL, `adresse` varchar(30) NOT NULL, `plz` smallint(5) UNSIGNED NOT NULL, `ort` varchar(30) NOT NULL. PRIMARY KEY (`id`), UNIQUE KEY `longlat` (`longitude`,`latitude`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `spritpreis` ( `id` int unsigned NOT NULL, `time` int(10) UNSIGNED NOT NULL, `preis` DECIMAL(6,3) UNSIGNED NOT NULL, PRIMARY KEY (`id`,`time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
int vs binary(20) - 16 Byte gespart.
Zitat aus einem Post von Crash Overridetynitext vs varchar - andere Speichermethode, varchar kann schneller gelesen und geschrieben werden (Die länge ist wichtig falls mal ein Index drauf gelegt wird, da dann im Index ein CHAR feld draus wird. Diese Längenbegrenzung gibt es bei TINYTEXT nicht.)
Zitat aus einem Post von Crash Overridedecimal vs float - spart nur 1 Byte aber ist besser zu lesen.
Zitat aus einem Post von Crash OverrideVerwende möglichst immer das schmalste Charset, dass dir zur verfügung steht, für in Europa liegende Namen, Adressen und Orte genügt latin1, dies verbraucht nur halb so viel Speicherplatz und Ram wie UTF8. Zusätzlich stimmt MySQL UTF8 nicht mit anderen Standards überein und mann sollte dann lieber UTF8mb4 nutzen, was den benötigten Speicherplatz noch einmal verdoppelt.
Zitat aus einem Post von Crash Overridesollte wohl eher sein:Code: SQLINSERT INTO tankstelle (id, longitude, latitude, name, adresse, plz, ort) VALUES (:id, :longitude, :latitude, :name, :adresse, :plz, :ort) ON DUPLICATE KEY UPDATE id=:id
Code: SQLINSERT INTO tankstelle (id, longitude, latitude, name, adresse, plz, ort) VALUES (:id, :longitude, :latitude, :name, :adresse, :plz, :ort) ON DUPLICATE KEY UPDATE name=:name, adresse=:adresse, plz=:plz, ort=:ort
ZitatWenn ich also die Variable nicht direkt ins SELECT schreibe, gehts nicht. Warum?
Nein, hab ich nie herausgefunden. Der Fehler war, dass das Ergebnis leer war.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025