kostenloser Webspace werbefrei: lima-city


Warning Warning: in_array(): Wrong datatype for second argument in...

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    dathneo

    dathneo hat kostenlosen Webspace.

    Hi,
    ich habe ein Scipt mit folgendem Code:
    include("data/zugriff.inc.php");
    
    $query = "SELECT * FROM reserve";
    $result = mysql_query($query);
    while($row = mysql_fetch_array($result)){
    $sendid = $row[sendid];
    }
    mysql_close();

    [...]
    if (in_array(5, $sendid)) { echo "Gefunden"; } else { echo "Nicht gefunden";}


    Ich kann wirklich keinen Fehler erkennen, trotzdem kommt immer die Fehlermeldung: Warning Warning: in_array(): Wrong datatype for second argument in... .
    Habe schon die Boardsuche und Google benutzt, aber beides hilft leider nicht.

    Hoffentlich wisst ihr es...
    Danke im Vorraus. MfG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Es kann ja passieren, da du $row nicht als Array initialisierst, dass es auch gar kein Array ist sondern nur eine Variable mit Inhalt. Deshalb musst du den Datentyp für diesen Fall einfach vorschreiben. Das ganze nennt sich auch Typecasting.
    http://www.php.net/manual/de/language.types.type-juggling.php#language.types.typecasting
    if (in_array(5, (array)$sendid)) { echo 'Gefunden'; } else { echo 'Nicht gefunden';}


    Aber hier mal ein anderer Vorschlag für die Schreibweise:
    (in_array(5, (array)$sendid)) ? print 'Gefunden' : print 'Nicht gefunden';
  4. Autor dieses Themas

    dathneo

    dathneo hat kostenlosen Webspace.

    Vielen Dank schonmal,

    die Fehlermeldung ist jetzt weg, aber leider erkennt jetzt die Funktion "in_array" die Werte im array nicht mehr... :(. D.h. Werte die in der Datenbank vorhanden sind werden trotzdem nicht erkannt.



  5. Was steht denn in der Datenbank drin?
  6. Autor dieses Themas

    dathneo

    dathneo hat kostenlosen Webspace.

    Danke für deine Hilfe.
    In der Datenbank stehen sendid, vorname und nachname.
    Es soll so sein:
    Wenn der Wert X für sendid in der Tabelle steht soll ein rotes Bild angezeigt werden ansonsten ein grünes. Sozusagen ob der Platz noch "frei" ist oder nicht.

    (Sendid wird nicht automatisch indiziert).

    mfg

    Edit: Hatte grad nen lustigen Fehler: In der Tabelle stehen jetzt namen mit id 1,3 und 6. Für 3 hat es funktioniert für die beiden anderen nicht. Ich bin mir 100% sicher dass ich das Script an allen stellen richtig verändert hab (da ich den code kopiert habe)

    Beitrag geaendert: 13.12.2006 19:02:00 von dathneo
  7. Kannst du mal den ganzen Code posten?

    Vielleicht hilft es auch, wenn du ein paar mehr Hochkommas setzt. Z.B. bei $row[sendid] oder bei in_array().
  8. n****x

    Wenn in_array($wert, $mein_array) der Meinung ist, dass es einen Wert nicht findet, dann solltest du dir das zu durchsuchende Array mal daraufhin anschauen. Das geht in PHP5 schön mit var_dump($mein_array). Hier siehst du auch gleich die entsprechenden Datentypen.

    Außerdem solltest du dir angewöhnen, Array-Schlüssel in einfache Hochkommas zu stecken, wenn es sich dabei um String-Konstanten ("String-Literale") handelt.

    Und das gehört an den Anfang eines PHP-Scripts, wenn man noch daran herumbastelt:

    error_reporting( E_ALL | ( defined('E_STRICT') ? E_STRICT : 0 ) );
    @ini_set('display_startup_errors', TRUE);
    @ini_set('display_errors', TRUE);
    @ini_set('html_errors', TRUE);

    Danach dürfte es einige Fehlermeldungen und Warnungen produzieren. Die helfen meist weiter, weil sie (auf englisch) sagen, was wo nicht stimmt. Wenn sie dir nichts sagen, kannst du sie auch gerne hier mitteilen ...^^
  9. Autor dieses Themas

    dathneo

    dathneo hat kostenlosen Webspace.

    Habe jetzt folgendes ausprobiert:
    - hochkommas setzten, aber da ist keine veränderung sichtbar
    - vardump($sendid); gibt folgendes aus: string(1) "2" ?!
    - error_reporting gibt nur eine fehlermeldung aus und zwar:

    Notice: Undefined index: id in /srv/www/htdocs/web66/html/partyparade/reserve.php on line 21

    und zwar weil $id = $_GET["id"]; gesetzt ist, aber es auf der seite noch keine id hat.

    soll ich wirklich den ganzen code posten? der ist relativ lang... aber wenn es euch hilft kann ich ihn gerne posten.

    mir ist noch etwas aufgefallen: und zwar es funktioniert, solange nur eine zeile in der datenbank existiert. mit mehr zeilen funktioniert es nicht mehr...

    mfg
  10. n****x

    $id = isset($_GET['id']) : $_GET['id'] ? FALSE ;
    // oder ein anderer Wert als FALSE zur Voreinstellung

    in_array($wert, $array);
    sucht im ARRAY $array nach dem Wert $wert
    http://de.php.net/manual/de/function.in-array.php

    In deinem Ursprungsscript suchst du also in $send_id nach einem Eintrag der den Wert ("value") 5 hat. Da $send_id kein Array ist, gabs ne Fehlermeldung. Du kannst jetzt zwar $send_id "zwangs-casten", aber das ändert nichts daran, dass es sich hier nicht um ein Array mit einem Wert 5 handelt. Warum vergleichst du nicht einfach die beiden Werte als Zeichenketten?

    $vergleichswert = 5;
    if(strval($vergleichswert) == $send_id) {
    // prima
    }
    else{
    // So'n Mist!
    }

    Wobei man die Arbeit auch gleich der Datenbank übrlassen könnte. Wo wir sie doch sowieso schon befragen:

    "SELECT reserve.send_id FROM reserve WHERE send_id = 5"

    Dann kannst du mysql_affected_rows() aufrufen. Das gibt dir die Anzahl der Datensätze zurück, die die entsprechende send_id enthalten. Sind die send_ids eindeutig, ist das Ergebnis also immer 1 oder 0:

    1: ein passenderDatensatz enthalten
    0: kein passender Datensatz enthalten

    http://de.php.net/manual/de/function.mysql-affected-rows.php

    Das sollte für deine Zwecke auch funktionieren



    Beitrag geaendert: 14.12.2006 16:38:50 von notfux
  11. OMG! Ich bin ja auch blind. Du liest ja mit deiner While-Schleife eigentlich immer nur die letzte Zeile in deine Variable, die du davor noch nicht mal deklariert hast.

    Versuche es mal mit folgendem Code.
    <?php
      include('data/zugriff.inc.php');
    
      $query = 'SELECT * FROM reserve';
      $result = mysql_query($query);
      
      $sendid = array();
      while($row = mysql_fetch_array($result)){
        $sendid[] = $row['sendid'];
      }
      mysql_close();
    
        //mehr code...
      (in_array(5, (array)$sendid)) ? print 'Gefunden' : print 'Nicht gefunden';
    ?>


    Das casting habe drin gelassen, da ich erst vor zwei Tagen mit in_array ohne casting Probleme hatte.

    @alopex
    Das Problem für in_array ist nicht das casting. Das Problem dürfte wie gesagt das sein, was ich oben schrieb.
  12. n****x


    @alopex
    Das Problem für in_array ist nicht das casting. Das Problem dürfte wie gesagt das sein, was ich oben schrieb.


    Nehmen wir nurmal an, das es sinnvoll wäre, die Datenbank mit unnötigen Fragen zu belasten und danach noch in PHP alle ausgelesenen Datensätze auf eine ID zu vergleichen ...
    ... dann stellt sich immer noch die Frage:

    *ich_formulier das ab hier nochmal anders*

    Die Datenbank-Abfrage liefert mit ihren fetch...()-Befehlen immer ARRAYS zurück, die die entsprechenden Datenfelder enthalten. Diese Datenfelder (oder ARRAY-Elemente) sind immer vom Typ STRING. So.

    Angenommen, die SEND_ID ist für jeden Datenbankeintrag eindeutig, dann muss man doch nicht alle SEND_IDs in einem ARRAY sammeln, um später nachzuschauen, welches Element gesetzt wurde. Es genügt doch, die SEND_ID in einer Variablen zu speichern, die gesetzt wurde. Sollte ich hier falsch liegen, dann liegt das daran, dass ich davon ausgehe, dass IDs immer eindeutig sein müssen -- sonst würden sie nicht IDs heißen ...

    Nehmen mir also mal an, es sollen alle diese ominösen SEND_IDs, die gesetzt wurden, in einer Liste (ARRAY) erfasst werden. Dann gibt es hierfür eine schnellere Lösung ohne in_array().

    ...
    $alle_send_ids[ $row['sendid'] ] = TRUE; 
    ...
    mysql_close(); 
    ...
    
    ...
    $gesuchte_id = 5;
    isset($alle_send_ids[$gesuchte_id]) ? 'gesetzt' : 'nicht gesetzt';
    // oder eben mit if(isset($alle_send_ids[$gesuchte_id])) {...} else {...}
    ...
    
    Denn in_array() ist unter Umständen sehr langsam: 
    http://de.php.net/manual/de/function.in-array.php


    Beitrag geaendert: 14.12.2006 18:11:26 von notfux
  13. Den Sinn seines Codes will ich auch gar nicht hinterfragen, aber ich habe es so gesehen, dass er alle IDs ausliest und überprüft, ob die gesuchte dabei ist. Es stimmt schon, dass man das mit einer einfachen Abfrage in der Schleife lösen kann, aber dathneo hatte halt sein individuelles Problem, was gelöst werden wollte.
  14. Autor dieses Themas

    dathneo

    dathneo hat kostenlosen Webspace.

    Hey Leute,

    sorry, ich glaub ich bin irgendwie zu blöd, aber ich check jetzt garnimmer was richtig ist und was falsch. also ihr habt das problem genau richtig erkannt. ich will immer einen vergleichswert haben. ich wüsste sogar eine lösung dafür, nämlich so:
    //variablen
    $wert = 5; 
    
    //sql
    $query = "SELECT * FROM reserve WHERE sendid = '$wert' LIMIT 0,1";
    $result = mysql_query($query);
      
    while($row = mysql_fetch_array($result)){
    
        $sendid = $row['sendid'];
    
      }
    if ($wert == $sendid) { 
    //gut
    } else {
    // schlecht
    }

    das problem ist nur, dass der datenbank server sehr darunter leiden würde. deswegen wollte ich möglichst eine andere lösung...

    Es wäre sehr nett, wenn ihr mir nochmal sagen könntet, wie ich es jetzt probieren soll.

    Vielen Dank an euch alle!
    mfg

    Ps: Ja $sendid ist wie schon vermutet ein index also eindeutig.

    Beitrag geaendert: 16.12.2006 18:17:54 von dathneo
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!