Problem mit Variablentyp nach MySQL
UrsB
- php
Hallo zusammen,
ich hab (mal wieder) ein kleines Problem.
Und zwar ändert die Variable $newid ihren Typ von integer zu NULL und ich verstehe weder wieso noch wie ich es verhindern kann. Wäre um jede Hilfe dankbar. Ich hoffe ich habe alle nötigen Infos angehängt.
$sql="SELECT MAX(`id`) FROM `category`" ;
$sql=mysql_query($sql);
$newid = 0;
echo "var: ".gettype($newid)."<br />"; //integer
while($unter=mysql_fetch_array($sql)){
$newid = $unter[id];
}
echo "var: ".gettype($newid)."<br />"; //null
$title = $_POST["catAddTitle"];
$sql = "INSERT INTO 'category'('id' , 'title' ) VALUES ( '".strval ($newid)."' , '".$title."' );";
$db_erg = mysql_query($sql);
echo "var: ".gettype($newid)."<br />"; //null
echo $sql."<br />"; //INSERT INTO 'category'('id' , 'title' )VALUES ( '' , 'test' );
--
-- Tabellenstruktur für Tabelle `category`
--
CREATE TABLE IF NOT EXISTS `category` (
`id` int(9) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `category`
--
INSERT INTO `category` (`id`, `title`) VALUES
(1, 'cat01'),
(2, 'cat02'),
(3, 'cat03'),
(4, 'cat04'),
(5, 'cat05'),
(6, 'cat06'),
(7, 'cat07'),
(8, 'cat08'),
(9, 'cat09'),
(10, 'cat10');
Hallo,
Dein Code enthält so ziemlich alle Fehler, die ich gerade in einem anderen Thread bemängelt habe: 1 bis 5 - außer, dass hier prepared Statements nicht unbedingt nötig sind, aber beim Kontextproblem helfen.
Dein kompliziertes Vorgehen kannst Du Dir mit der AUTO_INCREMENT-Eigenschaft für Deine id-Spalte vom Hals halten.
Freundliche Grüße
Vinzenz
Hallo,
Und zwar ändert die Variable $newid ihren Typ von integer zu NULL und ich verstehe weder wieso noch wie ich es verhindern kann.
$sql="SELECT MAX(id
) FROM category
" ;
$sql=mysql_query($sql);
$newid = 0;
echo "var: ".gettype($newid)."<br />"; //integerwhile($unter=mysql_fetch_array($sql)){
$newid = $unter[id];
Achso, ja: Deine Abfrage enthält keine Spalte mit dem Namen id, deswegen enthält die Variable $unter auch keinen Schlüssel mit dem Wert 'id' (Du hast die Anführungszeichen zusätzlich noch vergessen). Daher der NULL-Wert.
display_errors = ALL
hätte Dir weitergeholfen.
Du kannst mit einem Aliasnamen dafür sorgen, dass es im Abfrageergebnis eine Spalte mit dem Namen id gibt:
[code lang=sql]SELECT
MAX(id) id
FROM
category
a) ich halte es in den seltensten Fällen für eine gute Idee, den Namen einer
vorhandenen Spalte als Aliasnamen zu gebrauchen,
b) könntest Du mit dem Einsatz von [COALESCE()](http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_coalesce) den Test auf 0 vermeiden:
~~~sql
SELECT
COALESCE(MAX(id), 0) newid -- Achtung: Spalte heißt jetzt "newid"
FROM
category
liefert immer eine Zahl zurück, auch wenn es noch gar keine id in der
Tabelle ist
c) ist eine automatisch generierte id die bessere Wahl, z.B. AUTO_INCREMENT.
Freundliche Grüße
Vinzenz
Vielen Dank für deine Hilfe. Funktioniert jetzt alles bestens. Werde deine Ratschläge auch in zukunft beherzigen. DANKE
Hi!
display_errors = ALL
hätte Dir weitergeholfen.
error_reporting auf E_ALL und display_errors auf on hätte das sicher werden sollen. Und natürlich dann der Einsatz von var_dump() als wichtigstem Debug-Werkzeug von PHP, wenn die mit dem error_reporting=E_ALL nicht mehr unterdrückte Notice-Meldung einen Zugriff auf etwas nicht vorhandenes anzeigt, um sich eben das anzuzeigen, was stattdessen wirklich vorhanden ist.
Lo!