PHP Per Checkboxen MSSQL Select steuern

wiked

Ensign
Registriert
Juni 2008
Beiträge
135
Hi liebe CB Gemeinde,

derzeit versuche ich mich daran eine SQL Abfrage mit Checkboxen zu steuern. Im Detail sieht das ganze so aus, dass es auf der ersten Seite Checkboxen gibt, mit denen man bestimmen kann, welche Spalten angezeigt werden sollen. Das funktioniert auch soweit. (zumindest bekomme ich in dem Zusammenhang keine Fehlermeldung) ABER dafür woanderst.

Hier einmal der Code für die Checkboxen:

PHP:
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/dbabfrage.css">
</head>
<body>
<form action="dbabfrage_ergebnis.php" method="post">
<div id="alle"><input type=checkbox name="alle">
Alle Spalten anzeigen
</div>
<div id="status"><input type=checkbox name=dbinfo[] value=Testfall_Status>
Spalte "Testfall_Status" anzeigen
</div>
<div id="benutzer"><input type=checkbox name=dbinfo[] value=Benutzer>
Spalte "Benutzer" anzeigen
</div>
<div id="durchfuehrungsdatum"><input type=checkbox name=dbinfo[] value=Durchführungsdatum>
Spalte "Durchführungsdatum" anzeigen
</div>
<div id="ID"><input type=checkbox name=dbinfo[] value=Szenario_ID>
Spalte "Szenario_ID" anzeigen
</div>
<div id="name"><input type=checkbox name=dbinfo[] value=Testfall_Name>
Spalte "Testfall_Name" anzeigen
</div>
<div id="zielsystem"><input type=checkbox name=dbinfo[] value=Zielsystem>
Spalte "Zielsystem" anzeigen
</div>
<div id="sub_zielsystem"><input type=checkbox name=dbinfo[] value=SuB_Zielsystem>
Spalte "SuB_Zielsystem" anzeigen
</div>
<div id="mandant"><input type=checkbox name=dbinfo[] value=Mandant>
Spalte "Mandant" anzeigen
</div>

<div id="start">Von <input type="text" name="start">
bis
</div>
<div id="ende"><input type="text" name="ende">
</div>

<div id="testertext">
Tester:
</div>
<?php
	$handle = fopen ("csv/Test.csv","r");
      $data = fgetcsv($handle, 30000, ';');
      echo '<select id="testerfilter" name="tester_filter">';
      echo '<option value="" selected></option>';
	  foreach ($data as $var){
        echo '<option value="'.htmlentities($var).'">'.htmlentities($var).'</option>';
    } 
    fclose ($handle);
    echo '</select>';
?>
</div>

<div id="submit"><input type="submit" value="Daten abfragen">
</div>
</form>
</body>
</head>
</html>

und hier die dazugehörige SQL-Abfrage:

PHP:
<?php
include 'dbconnect.php';

if(isset($_POST['start'])) {
    $start = $_POST['start'];
} else {
    $start= '';
}

if(isset($_POST['ende'])) {
    $ende = $_POST['ende'];
} else {
    $ende= '';
}

if(isset($_POST['tester_filter'])) {
    $benutzer = $_POST['tester_filter'];
} else {
    $benuter= '';
}

$i=0;
while($i<count($dbinfo)){
  $query="Exec_ID";
  $query.=",".$pcinfo[$i];
  $i++;
}
if($alle){
  $sql = ("SELECT * FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '$start' AND '$ende' AND Benutzer = '$benutzer'; ");
}
else{
  $sql = ("SELECT '$query' FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '$start' AND '$ende' AND Benutzer = '$benutzer'; ");
}
$result=odbc_exec($odbc,$sql);

echo "<table border=\"1\" colspan=\"2\">";
$row=odbc_fetch_object($result);

while($field=key($row)){
  echo "<th>$field</th>";
  next($row);
}

echo "</tr>";
echo "<tr><td>";
echo implode("<td>", $row);
echo "</tr>";

while($row = odbc_fetch_object($result)){
    echo "<tr><td>";
    echo implode("<td>", $row);
    echo "</tr>";
}
echo "</table><hr>";

Als Fehlermeldung bekomme ich: Warning: implode() [function.implode]: Invalid arguments passed in C:\xampplite\htdocs\test\dbabfrage_ergebnis.php on line 46 welche dieser Zeile entsprechen würde: "echo implode("<td>", $row);"
 
Ich vermute hier den Fehler:
PHP:
}
echo "</tr>";
echo "<tr><td>";
echo implode("<td>", $row);
echo "</tr>";

Wenn die Abfage kein Ergebnis lieferte ist $row kein array ?
 
Joa genau hier spuckt er auch den Fehlercode aus.... wie umgehe ich das jetzt am besten? Mir kommt gerade die Idee, dass wenn die Abfrage kein Ergebnis ausgiebt, er dann einfach eine leere Tabelle ausgeben soll.

EDIT: Gerade getestet, bringt auch keine Hilfe, da die Abfrage nichts leeres zurückgibt, sondern eigentlich ein Array ist!
 
Zuletzt bearbeitet:
am einfachsten ginge

if(is_array($row)){
echo "</tr>";
echo "<tr><td>";
echo implode("<td>", $row);
echo "</tr>";
}

Das aber nur als Schnelllösung. Ich finde den Code etwas suboptimal.
Ich würde keine leere Tabelle ausgeben, wenn nix geliefert wird. Wozu? Zerstört es das Design ohne Tabelle oder warum?

Du könnstest zb. auch den Tabellenheader in der folgenden Schleife gleich mit auswerten und beides Header und Content in jeweils einem string speichern und nach der Schleife dann einfach zusammenketten. Dann bekommste alles in einem Rutsch und sparst dir unnötige echos zwischendurch.
 
Okay und wie würdest du das realisieren codetechnisch? Bin noch eher Einsteiger, bin froh, dass ichs schon so weit geschafft habe. In der theorie hört sich das ja alles schlüssig an, aber die Umsetzung ist ein anderes Kapitel ;)
 
statt

PHP:
echo "<table border=\"1\" colspan=\"2\">";
$row=odbc_fetch_object($result);

while($field=key($row)){
  echo "<th>$field</th>";
  next($row);
}

echo "</tr>";
echo "<tr><td>";
echo implode("<td>", $row);
echo "</tr>";

while($row = odbc_fetch_object($result)){
    echo "<tr><td>";
    echo implode("<td>", $row);
    echo "</tr>";
}
echo "</table><hr>";

zb. so.

PHP:
$header = '';
$content = '';
$z = 0;

while($row = odbc_fetch_object($result)){
	if($z==0){
		$header .= "<tr><td>".implode("</td><td>", key($row))."</td></tr>";
	}
        $content .= "<tr><td>".implode("</td><td>", $row)."</td></tr>";
	$z++;
}

if(!empty($content)){
	echo  "<table border=\"1\">".$header.$content."</table><hr>";
}

ist aber ungeprüft! Aber so ungefähr.
Achso und ich würde statt odbc_fetch_object odbc_fetch_array empfehlen
 
Zuletzt bearbeitet:
Okay hab das einmal so umgesetzt wie von dir vorgeschlagen!
PHP:
<?php
include 'dbconnect.php';

if(isset($_POST['start'])) {
    $start = $_POST['start'];
} else {
    $start= '';
}

if(isset($_POST['ende'])) {
    $ende = $_POST['ende'];
} else {
    $ende= '';
}

if(isset($_POST['tester_filter'])) {
    $benutzer = $_POST['tester_filter'];
} else {
    $benuter= '';
}

$i=0;
while($i<count($dbinfo)){
  $query="Exec_ID";
  $query.=",".$pcinfo[$i];
  $i++;
}
if($alle){
  $sql = ("SELECT * FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '$start' AND '$ende' AND Benutzer = '$benutzer'; ");
}
else{
  $sql = ("SELECT '$query' FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '$start' AND '$ende' AND Benutzer = '$benutzer'; ");
}
$result=odbc_exec($odbc,$sql);

$header = '';
$content = '';
$z = 0;

while($row = odbc_fetch_array($result)){
    if($z==0){
        $header .= "<tr><td>".implode("</td><td>", key($row))."</td></tr>";
    }
        $content .= "<tr><td>".implode("</td><td>", $row)."</td></tr>";
    $z++;
}

if(!empty($content)){
    echo  "<table border=\"1\">".$header.$content."</table><hr>";
}

Selbe Fehler wie vorher. ABER er erzeugt jetzt ne Tabelle die wiefolgt aussieht:
HTML:
<table border="1">
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
</table><hr>

Und als Fehlermeldung kommt wieder:
implode() [function.implode]: Invalid arguments passed in C:\xampplite\htdocs\test\dbabfrage_ergebnis.php on line 42
 
Okay ich denke wir kommen dem ganzen einen Schritt näher :) Nur bekomm ich jetzt absolut gar nichts ausser dem oben von mir geposteten html Code mit der leeren Tabelle zurück. Wenn ich aber genau die selbe Abfrage in WinSQL mache bekomme ich ca. 30 Zeilen zurück...
 
hmm, lass Dir mal mit

while($row = odbc_fetch_array($result)){

var_dump($row);
if($z==0){

...

das $row ausgeben, ob es überhaupt ein array ist.
Evt. wird in dem assoziativArray beides zurückgeben, also index und keyname oder sonst was, wo dann das implode abdreht.
 
Da kommt das heraus

Code:
array(1) { [""]=>  string(0) "" }
array(1) { [""]=>  string(0) "" }
array(1) { [""]=>  string(0) "" }
array(1) { [""]=>  string(0) "" }
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" } 
array(1) { [""]=>  string(0) "" }
 
Das hab ich mir ja fast gedacht.
Er bekommt ja gar keine Inhalte bzw. nur ein leeres array.

dann liegt der Fehler weiter vorne.
evt. hier $result=odbc_exec($odbc,$sql);

Oder irgendwas an Deiner odbc connection funzt grundlegend schon net richtig.

poste auch mal die include dbconnect.php
Nimm Passwörter usw. vorher raus.
 
$result=odbc_exec($odbc,$sql);

mach danach mal ein:

if (!$result) { echo $sql; die;}

zur erklärung:

wenn odbc_exec ein fehler liefert kommt ein false zurück, mit if (!$result) wird das überprüft. Die verbindnug wird anschließend unterbrochen (die;) und danach deine sql abfrage ausgegeben (echo $sql;)
du kannst nun diese sql abfrage nehmen die dir angezeigt wird und direkt in der datenbank testen

ps: ich würde hinter jedem SQL statement diese abfrage reinbauen... ist eigentlich schon ein muss
 
Code:
$i=0; 
while($i<count($dbinfo)){ 
  $query="Exec_ID"; 
[B]  $query.=",".$pcinfo[$i]; [/B]
  $i++; 
}

A) Ich vermute das ist ein Tippfehler
B) In jedem Fall ist das grob fahrlässig (->SQL-Injections)
 
SQL-Injections sind in meinem Fall irrelvant, da das ganze nur im Intranet in der Firma läuft und selbst dort nur einer sehr kleinen und überschaubaren Benutzergruppe zur verfügung steht. Danke jetzt schon mal für die zahlreichen Tipps. Werde diese, morgen im laufe des Vormittags versuchen umzusetzen und meine Ergebnisse dann hier posten!

EDIT: Hanni2k

hab mir jetzt einmal das SQL statement ausgeben lassen:

SELECT '' FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '11.11.2008' AND '15.11.2008' AND Benutzer = '**********';

Benutzer wurde richtig ausgegeben, hab nur den Namen rausgelöscht nur die Checkboxen dürfte er nicht richtig übergeben...
 
Zuletzt bearbeitet:
SELECT '' FROM

Wenn DAS tatsächlich im Statement so steht ist klar warum nichts zurückkommt bzw nur ein Leerstring.
Dann überprüfe mal das $query.
 
$query ist bei mir auf alle Fälle nie leer!

PHP:
$i=1;
while($i<count($dbinfo)){
  $query = "Exec_ID";
  $query.=",".$dbinfo[$i];
  $i++;

Also müsste er auf alle Fälle die Spalte Exec_ID ausgeben oder?! Was mir aber gerade auffällt ist, er weiß doch eigentlich nicht was die Variable $dbinfo ist, oder? Wie übergebe ich aber das Array aus dem Formular? Auch mit:

PHP:
if(isset($_POST['dbinfo[]'])) {
    $dbinfo= $_POST['dbinfo[]'];
} else {
    $dbinfo= '';
}
?
 
Wenn du es über dbinfo[] in den checkboxen als Name löst müsst Du das dbinfo[]
der Reihenfolge nach, wie es im HTML vor kam über einen index auslesen.

also für die erste chekbox bspw. dbinfo[0]

Du könntest alternativ allerdings auch den Checkbox-Namen direkt zusammenbasteln, sprich ohne array
zb. per
<input type=checkbox name="dbinfo_0" value="1">
<input type=checkbox name="dbinfo_1" value="1">

Dann einfach in einer Schleife per Zähler abfragen ob 'dbinfo_'.$i belegt ist.

zb. so
$sqlSelectrStr[] =array();

for($i=0; $i<$maxcheckbox; $i++){
if( ${'dbinfo_' .$i} == 1){

$sqlSelectrStr[] = 'Spaltenname';
}
...
}

if(count($sqlSelectrStr) > 0){
$sqlSelectrStr = implode(',', $sqlSelectrStr) ;

blabla

SELECT ".$sqlSelectrStr." FROM
}




Und Dir so einen String mit den gewählten Spaltennamen für die SQL zusammenbasteln.

über ${'xxx' + $i} kann man php-Variablen deren Namen man nicht exakt angeben kann zusammenbasteln und quasi darüber referenzieren.

Das hätte auch den Vorteil, das du nicht die Spaltenname im html-text für jeden sichtbar machst. also sicherer.


PS:
Achso und wenn dann SO:

$dbinfo= $_POST['dbinfo'];
 
Zuletzt bearbeitet: (kleine Fehler endeckt, aber du wei)
Öhm okay :/ muss mal durchdenken was du das alles geschrieben hast und dann versuchen das umzusetzen. Aber danke schonmal für die Hilfe. Werd dann mein Ergebnis posten!

EDIT: So mein Versuch.. irgendwie bin ich aber keinen Schritt weiter gekommen...

PHP:
<?php
include 'dbconnect.php';

if(isset($_POST['start'])) {
    $start = $_POST['start'];
} else {
    $start= '';
}

if(isset($_POST['ende'])) {
    $ende = $_POST['ende'];
} else {
    $ende= '';
}

if(isset($_POST['tester_filter'])) {
    $benutzer = $_POST['tester_filter'];
} else {
    $benuter= '';
}

if(isset($_POST['dbinfo[]'])) {
    $dbinfo= $_POST['dbinfo[]'];
} else {
    $dbinfo= '';
}

$i=1;
while($i<count($dbinfo)){
  $query = "Exec_ID";
  $query.=",".$dbinfo[$i];
  $i++;

}
  if($alle){
    $sql = ("SELECT * FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '$start' AND '$ende' AND Benutzer = '$benutzer'; ");
  }
  else{
    $sql = ("SELECT '$query' FROM CFTEST WHERE Durchfuehrungsdatum BETWEEN '$start' AND '$ende' AND Benutzer = '$benutzer'; ");
  }
  $result=odbc_exec($odbc,$sql);

echo $sql;

if (!$result){
  echo $sql;
  die;
}

$header = '';
$content = '';
$z = 0;

while($row = odbc_fetch_array($result)){
    if($z==0){
        $header .= "<tr><td>".implode("</td><td>", array_keys($row))."</td></tr>";
    }
        $content .= "<tr><td>".implode("</td><td>", $row)."</td></tr>";
    $z++;
}

if(!empty($content)){
    echo  "<table border=\"1\">".$header.$content."</table><hr>";
}
 
Zuletzt bearbeitet:
Du scheinst ja auch wenig berücksichtigt zu haben was ich schrieb.

zb. steht immer noch

if(isset($_POST['dbinfo[]'])) {

die doppelklammer muss weg!

if(isset($_POST['dbinfo'])) {

Es wird über seinen (Index-)Namen angeprochen. Das es ein array ist weiß php selber, dass muss man ihm nicht nochmal mitteilen. ^^
$dbinfo bleibt aktuell folglich leer


und woher resultiert das if($alle){
evt. funzt es eher per if($_POST['alle']){


else {
$benuter= '';

Tippfehler?
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben