schizo
Produkt der Gesellschaft
|
Ich bin grad dabei, Daten aus einer mysql Abfrage in eine Tabelle zu schreiben Derzeit hab ich mit Kommentaren das Problem ziemlich eingegrenzt. $name=mysql_result($player_result,$number_rows,"name");
?>
<tr>
<td><?php echo $name; ?></td>
<?php
Ohne jene Zeilen erhalte ich den Table Header angezeigt. Füge ich diese Zeilen hinzu wird der ganze Table nicht angezeigt. $number_rows ist ein gültiger Wert, die Abfrage $player_result ist ebenfalls möglich, in dieser existiert auch die Spalte "name". das $name nach der Abfrage Spaces enthält sollte ja egal sein, oder? Der Syntax des Tables ist soweit korrekt. Füge ich statt obrigem Code ?>
<tr>
<td><?php echo $number_rows; ?>
</td>
<?php
ein wird der Table soweit korrekt angezeigt.
Bearbeitet von schizo am 09.11.2012, 20:05
|
Spikx
My Little Pwny
|
Es kommt kein error? Hast du die PHP errors überhaupt aktiviert? Mit zB. ini_set('display_errors', '1');
error_reporting(E_ALL ^ E_NOTICE);
|
schizo
Produkt der Gesellschaft
|
Es kommt kein error? Hast du die PHP errors überhaupt aktiviert? Mit zB. ini_set('display_errors', '1');
error_reporting(E_ALL ^ E_NOTICE);
Ich erhalte den Error PHP Parse error: syntax error, unexpected T_VARIABLE
in der nächsten einkommentierten Zeile $number_rows++;
|
Obermotz
Fünfzylindernazi
|
Ohne den genauen Code zu kennen: Mach einfach mysql_get_assoc und iterier mit einem foreach durch den Resultset. Geht auch mit while -> mysql_get_assoc liefert false wenn kein Ergebnis kommt.
btw. $number_rows hört sich mehr nach einer Anzahl an als nach einer Zählervariable..
|
schizo
Produkt der Gesellschaft
|
mah... Grund für die Meldung war, dass ich direkt nach dem <?php Statement den Kommentar gesetzt hab ( <?php/* ) und die nächste Zeile daher nicht in der php Sektion war
|
schizo
Produkt der Gesellschaft
|
Bin gerade auf ein Verständnisproblem bzgl. Forms gestoßen. Was passiert, wenn ich keine action setze? Wird dann das Form im selben Script ausgeführt? Konkret gehts um ein paar Checkboxen, anhand von welchen ich in weiterer Folge die dahinterliegende db updaten möchte. Da mehrere zusätzliche Parameter im Spiel sind möchte ich die Auswertung nicht auslagern (bzw. bin ich dazu derzeit nicht in der Lage). Kann mir hier jemand ev. gute Howtos liefern? Jene, auf die ich bis jetzt gestoßen bin haben mich leider nicht weitergebracht
|
Spikx
My Little Pwny
|
"Ausgeführt" wird ein Form gar nicht. Sobald der User auf "Senden" klickt ruft der Browser die URL auf, die im action attribute angegeben ist und sendet die Daten des Formulars als GET oder POST parameter mit. Wenn du also zum Beispiel eine form.php hast, die das Formular ausgibt, aber auch prozessiert (indem am Anfang im einfachsten Fall bspw. if( isset( $_POST['submit'] )
{
...
}
steht, oder wie auch immer du es dann umsetzt), dann trägst du eben die form.php in der action ein.
|
schizo
Produkt der Gesellschaft
|
"Ausgeführt" wird ein Form gar nicht. Sobald der User auf "Senden" klickt ruft der Browser die URL auf, die im action attribute angegeben ist und sendet die Daten des Formulars als GET oder POST parameter mit.
Wenn du also zum Beispiel eine form.php hast, die das Formular ausgibt, aber auch prozessiert (indem am Anfang im einfachsten Fall bspw.if( isset( $_POST['submit'] )
{
...
}
steht, oder wie auch immer du es dann umsetzt), dann trägst du eben die form.php in der action ein. Das hätte ich derzeit eigentlich auch so umgesetzt: <form action="index.php" method="post">
<input type="checkbox" name="participated" value="Yes" />
<input type="checkbox" name="team" value="Yes" />
<input type="submit" name="formSubmit" value="Submit" />
</form>
</td>
<?php
if (isset($_POST['participated']) && $_POST['participated'] == '1')
{
$id=mysql_result($results_result,$i,"player_id");
if (isset($_POST['team']) && $_POST['team'] == '1')
{
$team_query="UPDATE T_results SET T_results.team = '2' WHERE T_results.player_id = '$id' && T_results.game_id='$j+1'";
mysql_query($team_query);
}
else
{
$team_query="UPDATE T_results SET T_results.team = '1' WHERE T_results.player_id = '$id' && T_results.game_id='$j+1'";
mysql_query($team_query);
}
}
In der DB scheinen die Änderungen jedoch nicht auf. Das error.log schweigt sich auch aus.
|
Rektal
Here to stay
|
Im Formular schreibst du "value=Yes", aber im PHP-Code prufest du "... == "1". Apfel != Birne. Aendere 'value="Yes"' in 'value="1"'. Das Beispiel ist aber nicht komplett, oder? Du verwendest $i, $j, $id die ich nirgends definiert sehe. Vergiss dich das du anfaellig fuer SQL Injection bist, wenn du Variablen ohne Filterung/Pruefung direkt in SQL-Statements verwendest. Bessere waere es ueberhaupt, PDO und prepared Statements zu verwenden.
Bearbeitet von Rektal am 10.11.2012, 23:53
|
schizo
Produkt der Gesellschaft
|
Ah, ich dachte, dass true, 1 und yes generell denselben output liefern. Mal schauen, obs an dem liegt. Das ganze ist natürlich nur ein Auszug vom Code. Die zahlervariablen verwende ich hier kurz zuvor schon zum auslesenderselben rows, die ich updaten möchte. Insofern besitzen diese den 'richtigen' Wert. Die Problematik von SQL injections ist mir bekannt, dass ich diese durch prepared Statements verhindern kann allerdings nicht. Brauch ich zwar erst später (derzeit lese ich noch keine strings ein), aber danke für den Link
|
schizo
Produkt der Gesellschaft
|
Habe jetzt 'YES' gegen '1' getauscht und die Abfrage funktioniert soweit. Allerdings bin ich kurz darauf auf ein Logikproblem beim Update Statement gestoßen, dass ich mir nicht erklären kann: <form action="index.php" method="post">
<input type="checkbox" name="participated" value="1" />
<input type="checkbox" name="team" value="1" />
<input type="submit" name="formSubmit" value="Submit" />
</form>
</td>
<?php
if (isset($_POST['participated']) && $_POST['participated'] == '1')
{
mysql_connect('localhost',$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$player=mysql_result($results_result,$i,"player_id");
$game=$j+1;
if (isset($_POST['team']) && $_POST['team'] == '1')
{
$team_query="UPDATE T_results SET T_results.team = '1' WHERE T_results.player_id = '$player' && T_results.game_id='$game'";
}
else
{
$team_query="UPDATE T_results SET T_results.team = '0' WHERE T_results.player_id = '$player' AND T_results.game_id='$game'";
}
mysql_query($team_query);
}
Bei obrigen Queries werden sämtliche Rows upgedatet. Tausche ich $game gegen $j+1 aus (eben den Wert, welchen ich $game übergebe werden sämtliche Rows mit player_id = '$player' upgedatet. Gebe ich hier einen bestimmten Integer Wert ein wird nur eine einzelne Row upgedatet (was mein gewünschtes Ziel ist). Gebe ich $game aus wird jener Wert angezeigt, mit welchem ich zuvor $game testweise ersetzt habe.
|
Rektal
Here to stay
|
Ah, ich dachte, dass true, 1 und yes generell denselben output liefern. Mal schauen, obs an dem liegt. Jain, siehe folgendes Beispiel: $ php -r 'var_dump( true == "1", "Yes" == "1", 1 == "1");'
bool(true)
bool(false)
bool(true)
Das Beispiel ist noch einfach und klar, PHP hat aber leider sehr inkonsistente implizite Type Juggling rules. Ich lege dir PHP Type Juggling und vor allem PHP Type Comparison ans Herz. Obwohl alles dokumentiert ist, kenne diese Seiten oft nicht mal Erfahrene PHP-Entwickler ... $game=$j+1;
if (isset($_POST['team']) && $_POST['team'] == '1')
{
$team_query="UPDATE T_results SET T_results.team = '1'
WHERE T_results.player_id = '$player' && T_results.game_id='$game'";
}
else
{
$team_query="UPDATE T_results SET T_results.team = '0'
WHERE T_results.player_id = '$player' AND T_results.game_id='$game'";
}
Bei obrigen Queries werden sämtliche Rows upgedatet. Tausche ich $game gegen $j+1 aus (eben den Wert, welchen ich $game übergebe) werden sämtliche Rows mit player_id = '$player' upgedatet. Gebe ich hier einen bestimmten Integer Wert ein wird nur eine einzelne Row upgedatet (was mein gewünschtes Ziel ist). Gebe ich $game aus wird jener Wert angezeigt, mit welchem ich zuvor $game testweise ersetzt habe.
Wenn du einzelne Werte schon angesehen hast und es dir keinen Rueckschluss gibt, musst du weiter gehen und z.B. das gesamte SQL-Statement ausgeben und schauen ob das so richtig ist/Sinn macht. Ich hab einen Teil nicht ganz verstanden, aber wenn du im SQL-Statement schreiben wuerdest: $team_query = ".... WHERE .. T_results.game_id = '$j+1'"
ist das ziemlich sicher falsch, da in der WHERE Bedingung dann ein Integer-Operation stehen wird welche als String Comparison verwendet wird, z.B. "... WHERE T_results.game_id = '1+1'" wird nicht matchen wo game_id = 2 ist, sondern 1 ... weil SELECT 1 = '1+1' -> 1 ergeben wird (oder anders rum: SELECT 2 = '1+1' -> 0). Aber vielleicht habe ich deine letzte Frage auch nicht ganz verstanden, vielleicht kannst es anders noch formulieren, falls du nicht weiterkommst. Noch ein Tipp: ich wuerde verzichten, den Shutup-Operator ("@") zu verwenden. Da kannst du error_reporting noch so aufdrehen, du wirst den Error dann nicht mal im Log sehen, nur die Message auf der Webseite die du in die() stehen -> im Problemfall auch nicht hilfreich. Entwickeln immer mit E_ALL + E_STRICT ...
|
schizo
Produkt der Gesellschaft
|
Ich hab einen Teil nicht ganz verstanden, aber wenn du im SQL-Statement schreiben wuerdest:
$team_query = ".... WHERE .. T_results.game_id = '$j+1'"
ist das ziemlich sicher falsch, da in der WHERE Bedingung dann ein Integer-Operation stehen wird welche als String Comparison verwendet wird Danke, das wars. Ich stehe jetzt aber vor einem neuen Problem: Ich hatte ursprünglich nur zwei Checkboxen eingebaut, wodurch ich natürlich keinen brauchbaren Output erhalten habe. Daher verwende ich hier nun ein Array "part[]", welches ich mittels POST übergebe: <input type="hidden" name="part[]" value="0" />
<input type="checkbox" name="part[]" checked="checked" value="1" />
Dazu habe ich zwei Fragen: Im Firebug sehe ich im Post den korrekten Inhalt des Arrays. Wenn ich diesen jedoch nach dem Submit mittels var_dump($_POST['part']);
ausgeben möchte erhalte ich nur NULL Mit der Variante foreach($_POST['part'] as $asdf) { echo $asdf; }
erhalte ich nur die Fehlermeldungen "Undefined index" und "Invalid argument supplied for foreach()" Wo habe ich hier nun wieder nen Fehler eingebaut? Die zweite Frage betrifft ebenfalls das Array "part[]": Ich habe auf diese Variante zurückgegriffen, da ich auch wissen muss, welche Checkboxen nicht aktiviert sind. Dadurch erhalte ich aber für jede 1 zusätzlich eine zuvorkommende 0. Diese kann ich natürlich aussortieren. Allerdings wärs halt schöner, wenn ich unabhängig vom Zusand der Checkbox durchs Array navigieren könnte. Gibts hier eine schönere Lösung?
|
Rektal
Here to stay
|
Ganz den Durchblick hab ich noch nicht  aber bezüglich des "muss wissen auch wenn checkbox nicht gecheckt ist"-Problem: ist relativ einfach, wenn du einen Index für die einzelnen checkboxen verwendest; dann weißt du beim Submit ganz genau welche und welche nicht gecheckt war. In Code ausgedrückt schreibst du: <input name="parts[4]" value="1"...
Du verwendest beim Generieren des HTML und beim Auswertung des "parts"-Arrays die selben Indizes und wenn bei Auswertung des parts-Array einer nicht gesetzt ist, weiß du dass diese Checkbox eben nicht gesetzt war. Das hört sich vielleicht umständlich an, ist aber relativ einfach. Ad warum $_POST["parts"] NULL ist: nach deiner Analyse fällt mir nichts direkt ein. Hast du dir schon "var_dump($_POST);" angeschaut? Vielleicht ists ja woanders reingerutscht  Hast eh alle Errors aufgedreht und sicherheitshalber ins PHP error.log geschaut?
|
schizo
Produkt der Gesellschaft
|
Die Einfachheit von Apple und die Offenheit von Android kombiniert.
Ich versteh leider derzeit nicht, wie ich das Array wieder auswerten kann. mit foreach erhalte ich nur jene Werte, welche ungleich NULL sind. Daher brauche ich entweder einen Standardwert, wenn die Checkbox nicht aktiviert ist oder eine Funktion, mit welcher ich die einzelnen Indizes ansteuern kann (diese hab ich bis jetzt leider vergeblich gesucht). Ad warum $_POST["parts"] NULL ist: nach deiner Analyse fällt mir nichts direkt ein. Hast du dir schon "var_dump($_POST);" angeschaut? Vielleicht ists ja woanders reingerutscht Hast eh alle Errors aufgedreht und sicherheitshalber ins PHP error.log geschaut? War ein Denkfehler, welcher mit der Weiterentwicklung des Codes offensichtlich wurde. Das error.log hab ich inzwischen zu schätzen gelernt (hat mir hier aber nicht weitergeholfen)
|