Warning Warning: in_array(): Wrong datatype for second argument in...
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
beitrag
fehlermeldung
id
listen
lustigen fehler
lsung
manual
reserve
result
schleifen
stecken
stehen
tabelle
variable
vergleichswert
vielen dank
voreinstellung
zeile
zugreifen
zurck
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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';
-
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.
-
Was steht denn in der Datenbank drin?
-
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 -
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(). -
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 ...^^
-
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 -
$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 -
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.
-
@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 -
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.
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage