(PHP) $_Get Probleme mit zweistelligen Werten
Rene Werner
- php
0 Dieter Raber0 Rene Werner0 Dieter Raber0 Rene Werner0 MudGuard0 Rene Werner0 wahsaga
0 Axel Richter
(PHP) $_Get Probleme mit zweistelligen Werten
ich lasse eine php datei aufrufen die bestimmte Werte in eine Datenbank reinschreibt, diese Daten werden mit $_Get abgefragt, klappt ohne Probleme wenn die werte einstellig sind, sobald es über 10 geht, geht nichts mehr. Hat jemand eine Idee?
Hallo Rene,
Was fuer ein Datentyp ist das betreffende Feld in der Datentabelle, was fuer eine Fehlermeldung wirft die Datenbank und welche Datenbank ist ueberhaupt im Spiel, wie sieht deine Query aus, was passiert, wenn du deine Query an der Kommandozeile ausfuehrst.
Ich hab hier noch einen Sack voll Fragen bereit, falls diese hier uns nicht weiterbringen.
Gruß,
Dieter
Hallo Rene,
Was fuer ein Datentyp ist das betreffende Feld in der Datentabelle, was fuer eine Fehlermeldung wirft die Datenbank und welche Datenbank ist ueberhaupt im Spiel, wie sieht deine Query aus, was passiert, wenn du deine Query an der Kommandozeile ausfuehrst.
Ich hab hier noch einen Sack voll Fragen bereit, falls diese hier uns nicht weiterbringen.Gruß,
Dieter
ok, ich versuche mal alles zu beantworten,
habs getestet unter PHP 4 und 5, MySQL4.4 und 5.0
Der Datentyp ist tinyint(2)
Glaube aber das es nicht an der Datenbankabfrage liegt, weil die
Abfrage macht er richtig, kommt nur nichts raus, da der Wert leer ist.
Hallo Rene,
Glaube aber das es nicht an der Datenbankabfrage liegt, weil die
Abfrage macht er richtig, kommt nur nichts raus, da der Wert leer ist.
Glauben wird dich nicht weitbringen, wir wissen leider immer noch nicht, was eigentlich passiert. Deshalb nochmal, wie sieht deine Query aus, bringt MySQL eine Meldung (Erfolg oder Fehler)? Was steht in GET, steht dein error_reporting auf E_ALL?
Gruß,
Dieter
Hallo Rene,
Glaube aber das es nicht an der Datenbankabfrage liegt, weil die
Abfrage macht er richtig, kommt nur nichts raus, da der Wert leer ist.
Glauben wird dich nicht weitbringen, wir wissen leider immer noch nicht, was eigentlich passiert. Deshalb nochmal, wie sieht deine Query aus, bringt MySQL eine Meldung (Erfolg oder Fehler)? Was steht in GET, steht dein error_reporting auf E_ALL?Gruß,
Dieter
Hier mal ein Teil der php abfrage, wo anscheinend das selbe Problem
auftritt, wenn der Wert $alliance auf z.B: "5" gesetzt wird, klappt
der Rest, alles über 9 geht nicht, hab in mehreren Dateien das Problem,
$alliance= '50';
if(!isset($alliance['alliance_id'])) {
/* header("Content-type: image/png");
header("Pragma: no-cache");
imagepng($im);*/
exit;
}
if ($size>2)
{
for ($t=0; $t<=162;$t++)
{
imageline($im,0,$t*$size,162*$size,$t*$size,$grid);
imageline($im,$t*$size,0,$t*$size,162*$size,$grid);
}
}
imageline($im,0,82*$size,162*$size,82*$size,$grid2);
imageline($im,82*$size,0,82*$size,162*$size,$grid2);
$sql = '
SELECT s.system_id, s.sector_id, s.system_x, s.system_y
FROM starsystems s';
if(!$q_systems = $db->query($sql)) {
message(DATABASE_ERROR, 'Could not query starsystems data');
}
while($system = $db->fetchrow($q_systems))
$glob_systems[$system['system_id']]=$system;
$q_planets = $db->query('SELECT system_id FROM planets WHERE planet_owner IN (SELECT user_id FROM user WHERE user_alliance='.$alliance['alliance_id'].') GROUP BY system_id');
while($planet = $db->fetchrow($q_planets)) {
$system=$glob_systems[$planet['system_id']];
// Quadrantenkoordinaten
$system['sector_id']--;
$px_x=82*$size;
$px_y=82*$size;
$tmp=$system['sector_id']-243;
Hi,
$alliance= '50';
$alliance ist jetzt also ein String.
if(!isset($alliance['alliance_id'])) {
isset($alliance['alliance_id']) müßte also immer false sein ($alliance ist ja ein String, kein Hash.
Die Bedingung ist demnach IMMER wahr, die Abfrage damit sinnlos.
$q_planets = $db->query('SELECT system_id FROM planets WHERE planet_owner IN (SELECT user_id FROM user WHERE user_alliance='.$alliance['alliance_id'].') GROUP BY system_id');
$alliance ist doch immer noch ein String. Warum greifst Du schon wieder so drauf zu, als wäre es ein Hash?
cu,
Andreas
Hi,
$alliance= '50';
$alliance ist jetzt also ein String.
if(!isset($alliance['alliance_id'])) {
isset($alliance['alliance_id']) müßte also immer false sein ($alliance ist ja ein String, kein Hash.
Die Bedingung ist demnach IMMER wahr, die Abfrage damit sinnlos.$q_planets = $db->query('SELECT system_id FROM planets WHERE planet_owner IN (SELECT user_id FROM user WHERE user_alliance='.$alliance['alliance_id'].') GROUP BY system_id');
$alliance ist doch immer noch ein String. Warum greifst Du schon wieder so drauf zu, als wäre es ein Hash?
cu,
Andreas
aber das erklärt noch nicht warum es bei werten unter 10 geht.
hi,
aber das erklärt noch nicht warum es bei werten unter 10 geht.
Es "geht" auch nicht, weil das, was du da machst, vollkommener Humbug ist - warum, hat dir Andreas ja erklärt.
Dass dabei zufällig das herauskommt, was du dir _wünschst_ - das hat mit "es geht" auch nur ebenso zufällig zu tun.
Also, überlege dir bitte, was du wirklich erreichen willst, und wie sich das sinnvoll erreichen lässt - und zerbrich dir nicht mehr den Kopf darüber, warum vollkommen sinnfreier Code unter manchen Umständen ausschließlich durch Zufall das bewirkt, was du wolltest.
gruß,
wahsaga
Hallo,»» Hi,
$alliance= '50';
$alliance ist jetzt also ein String.
if(!isset($alliance['alliance_id'])) {
isset($alliance['alliance_id']) müßte also immer false sein ($alliance ist ja ein String, kein Hash.
Die Bedingung ist demnach IMMER wahr, die Abfrage damit sinnlos.
Nein, leider ist PHP nicht so strikt im Behandeln von Typen. Dass man einen String wie ein Array ansprechen kann, ist per Definition so.
Dass aber $myString["dummy"] == $myString[0] ist, war mir auch neu, ist aber offensichtlich so:
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
$myString = "1234";
echo $myString[0]."<br>";
echo $myString[3]."<br>";
echo "<hr>";
echo $myString["dummy"]."<br>";
echo "<hr>";
echo var_dump($myString["dummy"])."<br>";
echo var_dump($myString[0])."<br>";
echo var_dump($myString["dummy"]==$myString[0])."<br>";
echo "<hr>";
echo var_dump(isset($myString[0]))."<br>";
echo var_dump(isset($myString["dummy"]))."<br>";
?>
viele Grüße
Axel
Hi,
Nein, leider ist PHP nicht so strikt im Behandeln von Typen. Dass man einen String wie ein Array ansprechen kann, ist per Definition so.
Dass aber $myString["dummy"] == $myString[0] ist, war mir auch neu, ist aber offensichtlich so:
PHP wird mir immer unsympathischer ...
Ist ja schon die Vermischung von Dateien und Ressourcen schlimm, der Unsinn mit den Magic Quotes noch schlimmer, aber daß isset($myString["dummy"]) true liefert, ist ja wohl absoluter Schwachsinn.
cu,
Andreas
Hi,
Dass aber $myString["dummy"] == $myString[0] ist, war mir auch neu, ist aber offensichtlich so:
PHP wird mir immer unsympathischer ...
Wieso das? Das ist ein absolut logisches Verhalten. "dummy" ist undefiniert (würde bei error_reporting(E_ALL) eine Warnung geben). Somit ergibt diese Abfrage das erste Zeichen des Strings $myString.
Das erste Zeichen ist dann natürlich das gleiche, wie $myString[0].
Im übrigen ist ein String immer ein Array, das kennt man ja schon aus C ;)
Hi,
Dass aber $myString["dummy"] == $myString[0] ist, war mir auch neu, ist aber offensichtlich so:
PHP wird mir immer unsympathischer ...Wieso das? Das ist ein absolut logisches Verhalten. "dummy" ist undefiniert (würde bei error_reporting(E_ALL) eine Warnung geben). Somit ergibt diese Abfrage das erste Zeichen des Strings $myString.
Nein, "dummy" ist nicht undefiniert. "dummy" ist ein Literal, das nicht undefiniert ist.
Das erste Zeichen ist dann natürlich das gleiche, wie $myString[0].
Im übrigen ist ein String immer ein Array, das kennt man ja schon aus C ;)
Warum gibt dann
isset($_POST['wertdernichtinpostalskeyvorkommt'])
false?
Nach der gleichen Logik müßte ja, sobald mindestens ein Wert in $_POST enthalten ist, $_POST['wertdernichtinpostalskeyvorkommt'] dasselbe sein wie $_POST[0] ...
cu,
Andreas
Hi Andreas,
Nach der gleichen Logik müßte ja, sobald mindestens ein Wert in $_POST enthalten ist, $_POST['wertdernichtinpostalskeyvorkommt'] dasselbe sein wie $_POST[0] ...
Da hast du recht, das ist dann unlogisch. Macht es in dem Fall nen Unterschied, ob man ' oder " benutzt?
Hi,
Da hast du recht, das ist dann unlogisch. Macht es in dem Fall nen Unterschied, ob man ' oder " benutzt?
Nur, wenn dazwischen Variablen oder \ steht ;-)
cu,
Andreas
Hallo,
Dass aber $myString["dummy"] == $myString[0] ist, war mir auch neu, ist aber offensichtlich so:
PHP wird mir immer unsympathischer ...
Wieso das? Das ist ein absolut logisches Verhalten. "dummy" ist undefiniert (würde bei error_reporting(E_ALL) eine Warnung geben).
Nein, in einem Array würde es eine "Notice: Undefined index dummy in: ..." ergeben. Bei einem String eben nicht. Probier es aus:
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
error_reporting(E_ALL | E_STRICT);
$myString = "1234";
echo var_dump($myString)."<br>";
echo $myString[0]."<br>";
echo $myString["dummy"]."<br>";
echo "<hr>";
$myArray = array(chr(49), chr(50), chr(51), chr(52));
echo var_dump($myArray)."<br>";
echo $myArray[0]."<br>";
echo $myArray["dummy"]."<br>";
?>
Das _ist_ unlogisch.
Im übrigen ist ein String immer ein Array, das kennt man ja schon aus C ;)
Nein. In PHP ist ein String kein Array. Man kann die Array-Schreibweise lesend darauf anwenden. Das ist aber auch schon alles.
<?php
$myString = "1234";
echo var_dump($myString)."<br>";
$myString[2]="Hallo Welt";
echo var_dump($myString)."<br>";
echo "<hr>";
$myArray = array(chr(49), chr(50), chr(51), chr(52));
echo var_dump($myArray)."<br>";
$myArray[2]="Hallo Welt";
echo var_dump($myArray)."<br>";
?>
viele Grüße
Axel
Hi,
Das _ist_ unlogisch.
Unlogisch ist es nicht. Gewöhnungsbedürftig schon. Aber es ist trotzdem klar festgelegt: Bei der Typumwandlung in eine Integer wird jeder String (der nicht mit einer Integer beginnt) automatisch zu 0. Siehe Typentabelle.
Ein String hat zwar auch in PHP bestimmte Eigenschaften eines 'Arrays', jedoch nur im _herkömmlichen_ Sinne. Der PHP-Datentyp Array jedoch kann im Gegensatz zum String-Datentyp auch 'assoziative' (=String-) Schlüssel haben.
Daher entspricht bei $a = array('a','b','c');
der Ausdruck isset($a['dummy'])
dem Wert false
- der 'assoziative' Schlüssel 'dummy' ist nicht belegt.
Und bei $s = 'abc';
ergibt isset ($s['dummy'])
den Wert true
- in Strings gibt es keine 'assoziativen' Schlüssel, daher wird 'dummy' in eine Integer umgewandelt und entspricht in diesem Fall also 0.
Wie Manuel B. schon schrieb, gibt es hier zudem einen Error des Levels E_WARNING, da String-Indizes - zur besseren Unterscheidung - über geschweifte Klammern anzusprechen sind (Also in diesem - sinnlosen - Fall eigentlich $s{'dummy'}
.)
Man kann darüber nachdenken, ob die Ausdehnung der automatischen Typumwandlung bis hin zu String-Indexen sinnvoll ist - aber andererseits kann man genauso gut sagen: Wenn schon Typumwandlung, dann bitte überall.
Freundliche Grüße,
Sancho
Hallo,
Wie Manuel B. schon schrieb, gibt es hier zudem einen Error des Levels E_WARNING,
Hm. Den bekomme ich aber nicht. Siehe: https://forum.selfhtml.org/?t=131049&m=847612. Der Code 1 von dort ergibt:
string(4) "1234"
1
1
--------------------------------------------------------------------------------
array(4) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" }
1
Notice: Undefined index: dummy in [...]/test.php on line 15
Keine Warnung bei [echo $myString["dummy"]."<br>";] (PHP Version 5.1.4).
Ansonsten ist das mit den Typumwandlungen jetzt schon verständlich. Danke für die Klarstellung. Wäre aber trotzdem gut, wenn man wenigstens eine Warnung bekommen würde.
viele Grüße
Axel
Hallo Axel,
(Sorry, ich war aushäusig und musste erst den - trotz allen Fieberns für die Elfenbeinküste - wohl doch verdienten Sieg Argentiniens verdauen.)
Keine Warnung bei [echo $myString["dummy"]."<br>";] (PHP Version 5.1.4).
Zu meiner Schande muss ich gestehen, dass ich das auch nicht nachgeprüft hatte, sondern einfach davon ausgegangen war :-S
Aber absolut korrekt: Es gibt in diesem Fall keine Warnung (auch bei mir nicht, weder in PHP 4.4.0 noch PHP 5.0.5). Besser wäre das wohl schon.
Vielen Dank für diese Klarstellung deinerseits.
Freundliche Grüße
und angenehme Nacht,
Sancho
echo $begrüßung;
Keine Warnung bei [echo $myString["dummy"]."<br>";] (PHP Version 5.1.4).
Aber absolut korrekt: Es gibt in diesem Fall keine Warnung (auch bei mir nicht, weder in PHP 4.4.0 noch PHP 5.0.5). Besser wäre das wohl schon.
Irrungen und Wirrungen beim Einzelzeichenzugriff in Strings:
Standard in PHP3 waren die []-Klammern. Aus technischer Gründen im Compiler hat man diese unter PHP4 zumindest als deprecated deklariert. Ob die [] (für den Einzelzeichenzugriff) tatsächlich in früheren PHP4-Versionen verschwunden waren weiß ich nicht. Jedenfalls sind die [] in den späteren Versionen und auch unter PHP5 mit der gleichen Funktionalität wie die {} vorhanden.
Ein Plan sah vor, die [] wieder zum Standard zu machen und ab PHP6 nur noch diese zu unterstützen. Dazu sollte wohl auch eine E_STRICT-Meldung unter PHP 5.1.0 für die {} eingeführt werden. Ich kann keine solche Meldung sehen.
Dass die $string[...]-Syntax für PHP noch erweitert werden soll ist ebenfalls dem Plan zu entnehmen.
echo "$verabschiedung $name";
Hallo dedlfix,
Irrungen und Wirrungen beim Einzelzeichenzugriff in Strings:
... Ein Plan ...
Vielen Dank für die erhellenden Hinweise - denn mir _war_ doch so, als hätte ich für den String-Einzelzeichen-Zugriff über [] schon mal eine Fehlermeldung erhalten. Das muss dann also in einer früheren 4er Version gewesen sein, als das noch als deprecated galt. (Hatte schon gedacht, dass ich das dann wohl geträumt haben müsse o_O).
Na, dann werde ich mir die für Version 6 nun wiederum gar nicht mehr vorgesehenen geschweiften Klammern wohl wieder abgewöhnen müssen.
Dass die $string[...]-Syntax für PHP noch erweitert werden soll ist ebenfalls dem Plan zu entnehmen.
Aha. In Version 6 wird es dann also wohl auch eine slice notation $r[1,2] für Arrays und Strings geben. Fein.
Freundliche Grüße,
Sancho