SQL abfrage aus Datenbank


coldstone28

Mitglied
Hi,

ich möche eine Spalte aus einer mysql Datenbank auswählen und den Inhalt mit einer if Anweisung vergleichen.
Dementsprechend soll dann was zum testen ausgegeben werden.

CODE:
PHP:
if(isset($_GET["action"]) && $_GET["action"] == "mark" && isset($_GET["id"])) {

$auswaehlen = $verbindung->query("SELECT Markiert FROM Liste WHERE id =".$_GET["id"]."");
    $auswahl = mysqli_query($verbindung, $auswaehlen);

if($auswahl == '0') {

    echo "geandert";
} else {

    echo "nicht geandert";
    }
}
Ich glaube ich mache was beim selektieren falsch, weis aber nicht genau was.
Ich komme in die erste if bedingung rein.
Ich habe 4 Datensätze in der Datenbank.
Der erste Datensatz ist mit markiert=1
Der Rest mit markiert=0

Nur springt er bei mir immer in die else bedingung rein, obwohl ich die mit Markiert=0 anklicke.
Ich hoffe ich konnte es erklären. :)
 

Sempervivum

Erfahrenes Mitglied
Lass dir mal die Variable $auswahl mit var_dump ausgeben, dann wirst Du erkennen, warum es nicht funktioniert. Das Manual sagt über den Rückgabewert von mysqli_query:
For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object.
D. h. auch wenn Du nur einen Datensatz und darin nur ein Element brauchst, liefert er dir immer ein Result Object und Du musst dir das, was Du brauchst, herausholen.
 

coldstone28

Mitglied
ok, das verstehe ich aber nicht so ganz.
Wenn ich mit var_dump($auswahl) ausgebe, gibt er mir einen boolischen ausdruck zurück, was ja jetzt einleuchtend ist. In diesem fall wird bool(false) ausgegeben.
Aber er müsste doch dann in die else Anweisung springen und "nicht geandert" ausgeben.
Es wird aber "geandert" ausgegeben.
Weil die bedinung "bool(false) == 0" ja nicht erfüllt wird.
Oder muss ich das so verstehen "bool(false)" == 0" --> entspricht wieder "false" und die Bedingung ist erfüllt?

Zu der eigentlichen Frage zurückzukommen, wie greife ich den auf den Inhalt eines Objektes um damit einen vergleich zu machen?
 

Sempervivum

Erfahrenes Mitglied
In diesem fall wird bool(false) ausgegeben.
Dann stimmt etwas mit der Query bzw. den Parametern nicht. Die Abfrage ist nicht erfolgreich. Lies im Manual nach.

Oder muss ich das so verstehen "bool(false)" == 0" --> entspricht wieder "false" und die Bedingung ist erfüllt?
bool(false)" == 0 ergibt true, und zwar weil Du nur zwei Gleichheitszeichen verwendest, d. h. der Typ wird nicht geprüft. Verwende drei und ich erwarte, dass es false ergibt.

wie greife ich den auf den Inhalt eines Objektes um damit einen vergleich zu machen?
Ungetestet und ohne Gewähr:
Code:
$result = mysqli_query($verbindung, $auswaehlen);
if ($result !== false) {
    $row = mysqli_fetch_assoc($result));
    $auswahl = $row['Markiert'];
    if($auswahl == '0') {
 

basti1012

Erfahrenes Mitglied
Klassische SQL-Injection.
Jo meine idee wäre so
PHP:
if(isset($_GET["action"]) && $_GET["action"] == "mark" && isset($_GET["id"])) {
    $escape_id=mysqli_real_escape_string($verbindung,$_GET["id"]),
    $auswaehlen = "SELECT `Markiert` FROM `Liste` WHERE `id`='$escape_id'";
    $result = mysqli_query($verbindung, $auswaehlen);
    if(mysqli_num_rows($result) >=1){
          echo "geandert";// obwohl hier nix geändert wird bei SELECT
    } else {
         echo "nicht geandert";
    }
}
 

coldstone28

Mitglied
bool(false)" == 0 ergibt true, und zwar weil Du nur zwei Gleichheitszeichen verwendest, d. h. der Typ wird nicht geprüft. Verwende drei und ich erwarte, dass es false ergibt.
jupp, mit === passt es.


Ungetestet und ohne Gewähr:
Code:
$result = mysqli_query($verbindung, $auswaehlen);
if ($result !== false) {
    $row = mysqli_fetch_assoc($result));
    $auswahl = $row['Markiert'];
    if($auswahl == '0') {
Das funktioniert leider nicht. Irgendwas ist glaube ich beim selektieren aus der Datenbank was falsch, weil wenn ich mit
var_dump($auswahl) ausgebe, kommt als Meldung "NULL"
 

coldstone28

Mitglied
Ich habe das jetzt wie folgt gemacht und es funktioniert bis jetzt.

PHP:
if(isset($_GET["action"]) && $_GET["action"] == "mark" && isset($_GET["id"])) {

$auswaehlen = "SELECT Markiert FROM Liste WHERE id =".$_GET["id"]."";
    $auswahl = $verbindung->query($auswaehlen);
$row = $auswahl->fetch_assoc();
    
    if($row['Markiert'] == '0') {
        echo "ist null";
    } else {
        echo "ist eins";
    }
}
Vielen dank für die nette Hilfe.
 

coldstone28

Mitglied
Mal eine weitere frage.

Kann ich die operationen in einer klasse erstellen und diese aufrufen?
Ich habs mal so versucht:

PHP:
.
.
.
    class operationen {

function markieren() {
 
    $auswaehlen = "SELECT Markiert FROM Liste WHERE id =".$_GET["id"]."";
$auswahl = $verbindung->query($auswaehlen) or die($verbindung->error);
$row = $auswahl->fetch_assoc();
   
    if($row['Markiert'] == '0') {
    $update = "UPDATE Liste SET Markiert ='1' WHERE id =".$_GET["id"]."";
 
    } else {
    $update = "UPDATE Liste SET Markiert ='0' WHERE id =".$_GET["id"]."";
    }
     mysqli_query($verbindung, $update);
   
}
.
.
.
    if(isset($_GET["action"]) && $_GET["action"] == "mark" && isset($_GET["id"])) {

    $del = new operationen();
    $del->markieren();
    }
Bekomme dabei folgende fehlermeldung:
Code:
 Uncaught Error: Call to a member function query() on null.....

Ich glaube der verbindet sich nicht hier mit der Datenbank:
PHP:
$auswahl = $verbindung->query($auswaehlen) or die($verbindung->error);
Außerhalb meiner Klasse habe ich ja am Anfang eine Verbindung mit:
PHP:
$verbindung = mysqli_connect($host, $user, $password);
die noch nicht geschlossen ist.

Auch wenn ich in der Klasse nochmal neu verbinde, geht es nicht.

Wenn ich zur Probe einfach echo ausgebe, wie:
PHP:
class operationen {
 
function markieren() {
 
    echo "test";
    
}
dann wird dies auch ausgegeben.
 
Zuletzt bearbeitet:

coldstone28

Mitglied
Die steht ganz oben in meiner php datei.

PHP:
$verbindung = mysqli_connect($host, $user, $password);
.
.
.
    class operationen {

function markieren() {
 
    $auswaehlen = "SELECT Markiert FROM Liste WHERE id =".$_GET["id"]."";
$auswahl = $verbindung->query($auswaehlen) or die($verbindung->error);
$row = $auswahl->fetch_assoc();
  
    if($row['Markiert'] == '0') {
    $update = "UPDATE Liste SET Markiert ='1' WHERE id =".$_GET["id"]."";
 
    } else {
    $update = "UPDATE Liste SET Markiert ='0' WHERE id =".$_GET["id"]."";
    }
     mysqli_query($verbindung, $update);
  
}
.
.
.
    if(isset($_GET["action"]) && $_GET["action"] == "mark" && isset($_GET["id"])) {

    $del = new operationen();
    $del->markieren();
    }
 

ComFreek

Mod | @comfreek
Moderator
Ich glaube, in PHP kannst du innerhalb von Funktionen auf globale Variablen nur dann zugreifen, wenn du
PHP:
function foo() {
  global $verbindung:

  /* ... */
}
schreibst.

Wenn du auf sauberen Code aus bist, würde ich von globalen Variablen abraten und noch einige Änderungen mehr vorschlagen. Etwa greifst du auf $_GET innerhalb der Klasse zu. Das ist i. Allg. sehr enges Coupling.
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Ich würde die Verbindung gleich dem Konstruktor übergeben. Weil ich da noch nicht so sattelfest bin, habe ich einen Test gemacht:
Code:
class Operationen
{
    public function __construct($conn)
    {
        $this->conn = $conn;
    }
    public function oneop($id)
    {
        var_dump($id);
        var_dump($this->conn);
    }
}
$op = new Operationen('theconn');
$op->oneop('7');
 

m.scatello

Mitglied
@Sempervivum
Kann man so machen, allerdings würde ich soetwas nur dann machen, wenn ich die Variable in mehreren Funktionen benötige. Ansonsten würde ich Funktionsparameter bevorzugen.
 

Neue Beiträge