UrsB: Problem mit Variablentyp nach MySQL

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');  

--
Selfcode:
ie:% fl:| br:> va:| ls:& fo:| rl:( n4:~ ss:| de:] js:| ch:? mo:} zu:)
  1. 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

  2. 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 />"; //integer

    while($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

    1. Vielen Dank für deine Hilfe. Funktioniert jetzt alles bestens. Werde deine Ratschläge auch in zukunft beherzigen. DANKE

    2. 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!