"We are back" « oc.at

php/mysql Problem

schizo 09.11.2012 - 20:03 8822 32
Posts

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
Ich bin grad dabei, Daten aus einer mysql Abfrage in eine Tabelle zu schreiben
Derzeit hab ich mit Kommentaren das Problem ziemlich eingegrenzt.

Code: PHP
$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
Code: PHP
?>
<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
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Es kommt kein error? Hast du die PHP errors überhaupt aktiviert? Mit zB.
Code: PHP
ini_set('display_errors', '1');
error_reporting(E_ALL ^ E_NOTICE);

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
Zitat von Spikx
Es kommt kein error? Hast du die PHP errors überhaupt aktiviert? Mit zB.
Code: PHP
ini_set('display_errors', '1');
error_reporting(E_ALL ^ E_NOTICE);

Ich erhalte den Error
Code:
PHP Parse error:  syntax error, unexpected T_VARIABLE
in der nächsten einkommentierten Zeile
Code:
$number_rows++;

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
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 :bash:

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
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
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
"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.
Code: PHP
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
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
Zitat von Spikx
"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.
Code: PHP
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:

Code: PHP
<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
Registered: Dec 2002
Location: Inside
Posts: 4480
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
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
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
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
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:

Code: PHP
<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
Registered: Dec 2002
Location: Inside
Posts: 4480
Zitat von schizo
Ah, ich dachte, dass true, 1 und yes generell denselben output liefern. Mal schauen, obs an dem liegt.
Jain, siehe folgendes Beispiel:
Code:
$ 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 ...
Zitat
Code: PHP
  $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:
Code: PHP
$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
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
Zitat aus einem Post von Rektal
Ich hab einen Teil nicht ganz verstanden, aber wenn du im SQL-Statement schreiben wuerdest:
Code: PHP
$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:

Code: HTML
<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
Code: PHP
var_dump($_POST['part']);
ausgeben möchte erhalte ich nur NULL
Mit der Variante
Code: PHP
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
Registered: Dec 2002
Location: Inside
Posts: 4480
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:
Code:
<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
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2571
Zitat von Rektal
Zitat von Earthshaker
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).

Zitat
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) ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz