Wertzuweisung in ein Array-Element schreibt XML-Objekt

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Mike Rofon

Erfahrenes Mitglied
Topic klingt kryptisch? Zugegeben. Aber wie kann ich das Problem besser betiteln?

Gegeben ist ein Array mit Rundenzeiten.
array(7) { [0]=> string(0) "" [1]=> string(6) "18.162" [2]=> string(6) "15.993" [3]=> string(6) "16.355" [4]=> string(6) "16.937" [5]=> string(6) "26.512" [6]=> string(6) "" }
ich sag mal....handbefüllt mit
PHP:
$runden = array ("", $daten->lap1, $daten->lap2, $daten->lap3, $daten->lap4, $daten->lap5, $daten->lap6);
aus einem Datenbank-Objekt.
Der Delinquent fährt jetzt seine nächste Runde. Deren Daten bekomme ich aus einer XML-Quelle, eingelesen per simplexml_load_file()
Zur Verfügung steht $driver->RUNDENZEIT.

Wenn ich jetzt aber sowas mache:
PHP:
$runden[intval($driver->RUNDEN)] = $driver->RUNDENZEIT;
(intval deswegen, weil ohne dem bekam ich ILLEGAL OFFSET TYPE)
sieht mein Array $runden plötzlich SO aus:
Code:
array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(6) "18.162"
  [2]=>
  string(6) "15.993"
  [3]=>
  string(6) "16.355"
  [4]=>
  string(6) "16.937"
  [5]=>
  string(6) "26.512"
  [6]=>
  object(SimpleXMLElement)#8 (1) {
    [0]=>
    string(6) "19.307"
  }
}
Jetzt könnte man denken, ok, mach es mit strval(), aber selfphp sagt:
"Mit strval() können Sie eine Variable in einen String konvertieren. Dabei darf die Variable von jedem einfachen Datentypen sein. Bei Arrays und Objekten ist diese Funktion nicht erlaubt."

Und das Merkwürdige ist: Wenn ich die Rundenzeit dann in die Datenbank schreibe, kommt dort nur der Wert 19.307 an.
PHP:
$sql = "UPDATE ".$dbprefix."rundenzeiten SET lap".$driver->RUNDEN." = '".$driver->RUNDENZEIT."' WHERE (car = '".$driver->STARTNR."') AND (nachname='".$drivernn."')";
funktioniert problemlos.

Es hilft auch nix, eine temporäre Variable zu benutzen.

Aber was könnte helfen?
 
"Mit strval() können Sie eine Variable in einen String konvertieren. Dabei darf die Variable von jedem einfachen Datentypen sein. Bei Arrays und Objekten ist diese Funktion nicht erlaubt."
Diese Information ist falsch. Am besten nur die offizielle PHP-Doku lesen: PHP: strval - Manual:
https://www.php.net/strval hat gesagt.:
var darf jeder skalare Datentyp sein oder ein Objekt, das die __toString Methode implementiert. Sie können strval() jedoch nicht auf Arrays oder Objekte, welche keine __toString Methode implementieren, anwenden.

Und siehe da, SimpleXMLElement deklariert eine __toString Methode: PHP: SimpleXMLElement::__toString - Manual

Und das Merkwürdige ist: Wenn ich die Rundenzeit dann in die Datenbank schreibe, kommt dort nur der Wert 19.307 an.
Ja, weil du es mit dem Stringkonkatenationsoperator "." zu einem String castest. Dabei wird auch __toString aufgerufen, nehme ich stark an.

Die Lösung ist also wirklich strval aufzurufen ;)

PS: Ich bin gerade mal auf die selfphp Homepage gegangen: PHP - SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum zum Thema PHP. Da steht noch was von PHP 4 & 5 Befehlsreferenz! Wir sind schon längst bei PHP 7 -- okay PHP 6 gab es nicht -- aber daraus würde ich den Schluss ziehen, dass diese Seite gar nicht mehr aktuell ist. Nutze also wirklich die offizielle PHP-Doku.
 
Diese Information ist falsch. Am besten nur die offizielle PHP-Doku lesen: PHP: strval - Manual:
Jetzt gibts auch schon Fake-News in der PHP-Doku... :unsure::unsure:
PS: Ich bin gerade mal auf die selfphp Homepage gegangen: PHP - SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum zum Thema PHP. Da steht noch was von PHP 4 & 5 Befehlsreferenz! Wir sind schon längst bei PHP 7 -- okay PHP 6 gab es nicht -- aber daraus würde ich den Schluss ziehen, dass diese Seite gar nicht mehr aktuell ist. Nutze also wirklich die offizielle PHP-Doku.
Muß ich mich wohl DOCH auf die CHM von PHP.net umstellen. Ich mag CHMs, aber die von php.net... mit der komm ich iwi noch nich so klar, bin die von selfphp gewöhnt.
Und GANZ ehrlich... ich hab als Hobbycoder absolut keine Ahnung, ob ich mein bissl Code PHP7-konform schreibe. Dazu kommt noch, daß das alles keine Webseiten werden, sondern eher nur Datenbereitstellungen für eine andere Anwendung. Der Apache läuft nur lokal.

Alles in allem: Danke!
und strval() funktioniert tatsächlich. Bitte nicht fragen, warum ich ausgerechnet HIER nich einfach drauflos gecodet hab.... so wie sonst auch :D
 
Dazu kommt noch, daß das alles keine Webseiten werden, sondern eher nur Datenbereitstellungen für eine andere Anwendung. Der Apache läuft nur lokal.
Trotzdem möchtest du vielleicht, dass deine Anwendung noch in einem Jahr läuft. Wenn es dumm läuft, benutzt du ein deprecated PHP5-Feature "aus Versehen", weil du die alte Doku liest. Und dieses Feature wird dann innerhalb eines Jahres entfernt.

Aber freut mich, dass es nun klappt :)
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück