SQL-Anfrage

#1
Hallo Leute,

ich habe ein script mit dem aus ein Formular-produkt erzeuge ich variante

bis jetzt lauft es so, was ein Administrateur oder ein User erstelle kann alle andere Users es sehen.
ich würde gern, dass alles was ein adminitrateur erstellt kann alle user sehen aber was ein User erstelle kann nur diese user und der Administrateur es sehen, aber nicht die andere User.

ich habe mir ein Sql Anfrage für diese Variante erstelle leider klappt es nicht so sieht mein statement aus
PHP:
$variants = 'select id, img_id, user_id, laeng_1, laeng_2, laeng_3, laeng_4,bem_1,bem_2,bem_3, a, b, c, d,e,al,be from variants join users using(user_id) where user_id = :current_user or user_id in( select user_id from users where role = "admin" ';
die tabelle sieht so aus:
User.sql
CREATE TABLE `users` (
`user_id` int(11) NOT NULL,
`login` varchar(250) NOT NULL,
`pass` varchar(250) NOT NULL,
`role` varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

unter rolle versteht man admin oder user

variants.sql

CREATE TABLE `variants` (
`id` int(16) NOT NULL,
`img_id` int(16) NOT NULL,
`user_id` int(11) NOT NULL,
`pos_nr` varchar(256) NOT NULL,
`farbe` varchar(256) NOT NULL,
`laeng_1` varchar(256) NOT NULL,
`laeng_2` varchar(256) NOT NULL,
`laeng_3` varchar(256) NOT NULL,
`laeng_4` varchar(256) NOT NULL,
`bem_1` varchar(256) NOT NULL,
`bem_2` varchar(256) NOT NULL,
`bem_3` varchar(256) NOT NULL,
`a` int(11) DEFAULT '0',
`b` int(11) DEFAULT '0',
`c` int(11) DEFAULT '0',
`d` int(11) DEFAULT '0',
`e` int(11) DEFAULT '0',
`al` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

vielen Dank im Voraus für Eure Hilfe
 
#3
Hi,

bekommst vom SQL Fehlermeldungen?

Grüsse,
BK
Ja, die Fehlermeldung lautet:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 ' in C:\xampp\htdocs\kant\variants.php:152 Stack trace: #0 C:\xampp\htdocs\kant\variants.php(152): PDO->query('select id, img_...') #1 C:\xampp\htdocs\kant\index.php(72): require_once('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\kant\variants.php on line 152

und die zeile 152 lautet : $req2 = $dbConnect->query($variants);
 
#4
Wieder mal das übliche. Schreibt eure SQLs in lesbarer Form und an sieht den Fehler SOFORT!
SQL-Statement in PHP lesbar darstellen
Bei dir ist ein Fehler gaaaaanz am Schluss
SQL:
select
    id, 
    img_id,
    user_id,
    laeng_1,
    laeng_2,
    laeng_3,
    laeng_4,
    bem_1,
    bem_2,
    bem_3,
    a,
    b,
    c,
    d,
    e,
    al,
    be
from
    variants
    join users using(user_id)
where
    user_id = :current_user
    or user_id in(
         select user_id
         from users
         where role = "admin"
Ach ja. Ein weiteres Problem. Du musst den Feldern sagen, von welcher Quelle sie stammen
Also. Deine Fehler
1) Am Ende fehlt ein )
2) Den Feldern die Quelle mitgeben. zB. users.user_id
 
#6
Wieder mal das übliche. Schreibt eure SQLs in lesbarer Form und an sieht den Fehler SOFORT!
SQL-Statement in PHP lesbar darstellen
Bei dir ist ein Fehler gaaaaanz am Schluss
SQL:
select
    id,
    img_id,
    user_id,
    laeng_1,
    laeng_2,
    laeng_3,
    laeng_4,
    bem_1,
    bem_2,
    bem_3,
    a,
    b,
    c,
    d,
    e,
    al,
    be
from
    variants
    join users using(user_id)
where
    user_id = :current_user
    or user_id in(
         select user_id
         from users
         where role = "admin"
Ach ja. Ein weiteres Problem. Du musst den Feldern sagen, von welcher Quelle sie stammen
Also. Deine Fehler
1) Am Ende fehlt ein )
2) Den Feldern die Quelle mitgeben. zB. users.user_id
so habe ich es in meinem Script gescrhieben

$variants = '
SELECT
id, img_id,
user_id,
laeng_1,
laeng_2,
laeng_3,
laeng_4,
bem_1,
bem_2,
bem_3,
a,
b,
c,
d,
e,
al,
be
FROM
variants
JOIN users USING(user_id)
WHERE
user_id = :CURRENT_USER
OR user_id IN(
SELECT user_id
FROM users
WHERE ROLE = 'admin');

leider immer eine Fehlermeldung mit 'admin' , was mache ich denn falsches ?
 
Zuletzt bearbeitet:

Bratkartoffel

gebratene Kartoffel
Premium-User
#7
Hi,

PHP:
$variants = '
SELECT
    id, img_id,
    user_id,
    laeng_1,
    laeng_2,
    laeng_3,
    laeng_4,
    bem_1,
    bem_2,
    bem_3,
    a,
    b,
    c,
    d,
    e,
    al,
    be
FROM
    variants
    JOIN users USING(user_id)
WHERE
    user_id = :CURRENT_USER
    OR user_id IN(
         SELECT user_id
         FROM users
         WHERE ROLE = 'admin');
Die ' von 'admin' müssen escaped werden.

Grüsse,
BK
 

cwriter

Erfahrenes Mitglied
#10
Hi

hier ist den Fehler Parse error: syntax error, unexpected 'admin' (T_STRING) in C:\xampp\htdocs\kant\variants.php on line 175
Sagt es doch schon:
Wie @Bratkartoffel schon sagte: PHP kann nicht wissen, was jetzt der String ist.
wo schliesst du die erste hochkomma?
Den Code hat er ja von dir...

PHP:
$variants = '
SELECT
   id, img_id,
   user_id,
   laeng_1,
   laeng_2,
   laeng_3,
   laeng_4,
   bem_1,
   bem_2,
   bem_3,
   a,
   b,
   c,
   d,
   e,
   al,
   be
FROM
   variants
   JOIN users USING(user_id)
WHERE
   user_id = :CURRENT_USER
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = 'admin');'
ist falsch, da php den String beim ''' vor dem 'a' beendet. Also entweder
PHP:
$variants = '
SELECT
   id, img_id,
   user_id,
   laeng_1,
   laeng_2,
   laeng_3,
   laeng_4,
   bem_1,
   bem_2,
   bem_3,
   a,
   b,
   c,
   d,
   e,
   al,
   be
FROM
   variants
   JOIN users USING(user_id)
WHERE
   user_id = :CURRENT_USER
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = \'admin\');'
oder

PHP:
$variants = "
SELECT
   id, img_id,
   user_id,
   laeng_1,
   laeng_2,
   laeng_3,
   laeng_4,
   bem_1,
   bem_2,
   bem_3,
   a,
   b,
   c,
   d,
   e,
   al,
   be
FROM
   variants
   JOIN users USING(user_id)
WHERE
   user_id = :CURRENT_USER
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = 'admin');"
(Siehe auch Highlighting hier im Forum... -> Grund, Codetags [code=php] [/code] zu verwenden)

cwriter
 
#11
Ich glaube bis jetzt waren die double Punkte vor CURRENT das problem, ich habe die entfernt,keine Fehlermeldung mehr, leider funktioniert die Anfrage es nicht richtig.
was ein user erstellt ist nicht sichbar, dh keine kann es sehen, aber ist in dei Datenbank sichbar, nur was der Administrator erstellt ist sichbar von allen.

ich wiederhole an dieser Stelle, was ich gern von der Anfrage haben will ist, dass :

Wenn ein User eine oder mehrere Variante erstellt, diese sollte von diese User und der Administrateur sichbar, alle andere User dürfen es nicht sehen.
aber was der Administrator erstellt sollte von allen sichbar
 

cwriter

Erfahrenes Mitglied
#12
Ich glaube bis jetzt waren die double Punkte vor CURRENT das problem
Nein.
http://php.net/manual/en/pdo.prepared-statements.php

ich habe die entfernt,keine Fehlermeldung mehr, leider funktioniert die Anfrage es nicht richtig.
You don't say. Du hast ja den Parameter entfernt. :rolleyes:

was ein user erstellt ist nicht sichbar, dh keine kann es sehen, aber ist in dei Datenbank sichbar, nur was der Administrator erstellt ist sichbar von allen.
Kann ich nicht nachvollziehen. Warum gibst du eigentlich nie Code? Sollen wir hier hin- und herraten, was dein Code gerade tut oder wie stellst du dir das vor?

ich wiederhole an dieser Stelle, was ich gern von der Anfrage haben will ist, dass :
Das scheint mit dir ein wiederkehrendes Motiv zu sein. Wie oft muss ich noch sagen, dass wir den Code sehen müssen?
Du klatschst immer einen winzigen Ausschnitt hin, der wahrscheinlich nicht einmal das Problem ist, und wiederholst dann einfach so lange, was dein Problem ist, bis das Thema wieder geschlossen wird, weil du dich unkooperativ verhältst.
Also langsam müsstest du es eigentlich verstanden haben.

Gruss
cwriter
 
#13
wenn ich die beide punkten wieder einfüge bekomme ich die Fehlermeldung
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 ' in C:\xampp\htdocs\kant\variants.php:210 Stack trace: #0 C:\xampp\htdocs\kant\variants.php(210): PDO->query('\nSELECT\n id,\n...') #1 C:\xampp\htdocs\kant\index.php(72): require_once('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\kant\variants.php on line 210

Zeile 210 : $req2 = $dbConnect->query($variants);

schon in phpmyadmin kann man die Anfrage nicht druchführen, wegen die double punkte
http://www.bilder-upload.eu/show.php?file=97a1bb-1479716708.png
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
#14
wenn ich die beide punkten wieder einfüge bekomme ich die Fehlermeldung
Und was sagt uns die? RTFM.

Warum nutzt du query() mit PDO? Nutze doch entsprechend prepare() und execute().
Mithilfe von Google wärst du übrigens auch auf die Lösung gestossen.
Mal abgesehen davon hast du immer noch keinen Code geliefert. Fehlermeldung ist gut, Fehlermeldung + Code wäre besser...

Gruss
cwriter
 
#15
hey cwriter,
so sieht das script aus
PHP:
<?php

require_once __DIR__ . '/connection.php';

$product = 'SELECT * FROM product WHERE id = '.$prodId;
$currentUser = 1234;
$req = $dbConnect->query($product);
$req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
$req->execute();
$prod    = $req->fetch(PDO::FETCH_ASSOC);


?>

<div id="produits">

  <div class="produit h-product" id="produit_<?php echo $prod['id'] ?>" align="center" style="margin-right:58%">
        <form method="post" action="formular.php" autocomplete="off" name="<?php echo $prod['id'] ?>">
            <input type="hidden" name="id" value="<?php echo $prod['id'] ?>">
         <table border="0" cellpadding="0">
                  <tr>
            <td style="  color:#FFFFFF ; background-color:#860000; width:0%; height:13px; border:3px solid #860000;">PRODUKT</td>
                  </tr>                   
          <tr class="row9">
                    <td class="column0 style24 null style27" colspan="4" rowspan="8">
                        <img style=" z-index: 1; left: 40px; top: 10px; width: 220px; height: 220px;"
                             src="images/<?php echo $prod['path'] ?>"><input type="hidden" name="selected_photo"
                                                                             value="<?php echo $prod['path'] ?>"></td>
                    <td class="column4 style10 s">a</td>
                    <td class="column5 style19 n" style="font-size:15px"><input type="text" name="a" size="6" maxlength="4"  value="<?php echo $prod['a'] ?>"></td>

                </tr>
                <tr class="row10">
                    <td class="column4 style11 s">b</td>
                    <td class="column5 style20 n" style="font-size:15px"><input type="text" name="b" size="6" maxlength="4"  value="<?php echo $prod['b'] ?>"></td>

                </tr>
                <tr class="row11">
                    <td class="column4 style11 s">c</td>
                    <td class="column5 style20 null" style="font-size:15px"><input type="text" name="c" size="6" maxlength="4"  value="<?php echo $prod['c'] ?>">
                    </td>

                </tr>
                <tr class="row12">
                    <td class="column4 style11 s">d</td>
                    <td class="column5 style20 null" style="font-size:15px"><input type="text" name="d" size="6" maxlength="4"  value="<?php echo $prod['d'] ?>">
                    </td>

                </tr>
                <tr class="row13">
                    <td class="column4 style11 s">e</td>
                    <td class="column5 style20 null" style="font-size:15px"><input type="text" name="e" size="6" maxlength="4"  value="<?php echo $prod['e'] ?>">
                    </td>

                </tr>
            <tr class="row17" >
                    <td class="column0 style14 s" style="font-size:14px; text-align:center;font-weight:bold"><input type="reset" name="affacer_donnée" value="effacer"></td>
                    <td class="column1 style40 n style42" colspan="2"></td>
                    <td class="column3 style15 s" style="font-weight:bold">
                    <input type="checkbox" name="variant"> Ajouter une Variante </td>
                    <td class="column4 style40 n style41" colspan="2">
                    <input type="submit" name="save_product" value="Sauvegarder">
                    </td>
                </tr>   
       
                </tbody>
            </table>
        </form>
    </div>   

<?php
   
  // Variante
$variants = '
SELECT
   id,
   img_id,
   user_id,
   a,
   b,
   c,
   d,
   e 
FROM
   variants
   JOIN users USING(user_id)
WHERE
   user_id = :CURRENT_USER
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = \'admin\');';

    $req2 = $dbConnect->prepare($variants);

    while ($variant = $req2->fetch(PDO::FETCH_ASSOC)) {
   
    ?>
        <div class="produit" id="produit_<?php echo $variant['id'] ?>" align="center" style="margin-right:68%">
            <form method="post" action="formular.php" name="<?php echo $variant['id'] ?>">
                <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
                <table border="0" cellpadding="0">   
        <td style="  color:#FFFFFF ; background-color:#004B27; width:0%; height:13px; border:3px solid #004B27;">VARIANTE</td>
       
        <tr class="row9">
                        <td class="column0 style24 null style27" colspan="4" rowspan="8">
                            <img style=" z-index: 1; left: 40px; top: 10px; width: 220px; height: 220px;" src="images/<?php echo $prod['path'] ?>"><input type="hidden" name="selected_photo" value="<?php echo $prod['path'] ?>" ></td>
                        <td class="column4 style10 s">a</td>
                        <td class="column5 style19 n"style="font-size:15px"><input type="text" name="a" size="6" maxlength="4" value="<?php echo $variant['a'] ?>" ></td>

                    </tr>
                    <tr class="row10">
                        <td class="column4 style11 s">b</td>
                        <td class="column5 style20 n"style="font-size:15px"><input type="text" name="b" size="6" maxlength="4" value="<?php echo $variant['b'] ?>" ></td>

                    </tr>
                    <tr class="row11">
                        <td class="column4 style11 s">c</td>
                        <td class="column5 style20 null"style="font-size:15px"><input type="text" name="c" size="6" maxlength="4" value="<?php echo $variant['c'] ?>" ></td>

                    </tr>
                    <tr class="row12">
                        <td class="column4 style11 s">d</td>
                        <td class="column5 style20 null"style="font-size:15px"><input type="text" name="d" size="6" maxlength="4" value="<?php echo $variant['d'] ?>" ></td>

                    </tr>
                    <tr class="row13">
                        <td class="column4 style11 s">e</td>
                        <td class="column5 style20 null" style="font-size:15px"><input type="text" name="e" size="6" maxlength="4" value="<?php echo $variant['e'] ?>" ></td>

                    </tr>
         
               
                    <tr class="row17">
                        <td class="column0 style14 s" style="font-size:14px; text-align:center;font-weight:bold">

                            <input type="reset" name="daten_loeschen" value="Zurücksetzen">

                            </td>
                        <td class="column1 style40 n style42" colspan="2">

                        </td>
                        <td class="column3 style15 s">
                        </td>
                        <td class="column4 style40 n style41" colspan="2">
                        <input type="submit" name="save_variant" value="Speichern">
                        </td>
                    </tr>
              

                    </form>

                   <tr class="row17">
                        <td class="column0 style14 s"></td>

                        <td class="column1 style40 n style42" colspan="2">
                       
                         <form method="post" action="delete_variant.php" name="delete_<?php echo $variant['id'] ?>">
                            <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
                            <input type="hidden" name="img_id" value="<?php echo $prod['id'] ?>">
                            <input type="hidden" name="img_path" value="<?php echo $prod['path'] ?>">
                            <input type="hidden" name="type" value="variant">
                            <input type="hidden" name="location" value="<?php echo $_SERVER['REQUEST_URI'] ?>">
                            <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id'] ?>">
                            <input type="hidden" name="sessionID" value="<?php echo $_SESSION['sessionID'] ?>">
                            <input type="hidden" name="time" value="<?php echo $_SESSION['time'] ?>">
                            <input type="submit" name="select_variant" value="Löschen" style="align:center">
                        </form>
                      
                        </td>
                        <td class="column3 style15 s" style="font-size:14px; text-align:center;font-weight:bold">
                        <form method="post" action="drucker.php" name="<?php echo $variant['id'] ?>">
                            <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
                            <input type="hidden" name="img_id" value="<?php echo $prod['id'] ?>">
                            <input type="hidden" name="img_path" value="<?php echo $prod['path'] ?>">
                            <input type="hidden" name="type" value="variant">
                            <input type="hidden" name="location" value="<?php echo $_SERVER['REQUEST_URI'] ?>">
                            <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id'] ?>">
                            <input type="hidden" name="sessionID" value="<?php echo $_SESSION['sessionID'] ?>">
                            <input type="hidden" name="time" value="<?php echo $_SESSION['time'] ?>">
                            <input type="submit" name="select_variant" value="Auswählen" style="align:center">
                        </form>
                        </td>
                        <td class="column4 style40 n style41" colspan="2">
                        </td>
                    </tr>
                    </tbody>
                </table>

        </div>
        <?php
       
    }

?>
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
#16
Nach Zeile 92 solltest du den Wert für :CURRENT_USER angeben und das Statement executen; entweder per bindParam und execute oder durch execute(array). Siehe dazu Manual von PHP PDO.
http://php.net/manual/en/pdostatement.execute.php
Auf Zeile 5 hast du übrigens eine nette Injectionmöglichkeit...

Gruss
cwriter
 
#17
Gemäss Doku zu PDO->prapare, muss ein execute folgen in dem die Paramter übergeben werden.
Oder schöner, du bindest vorher ein Wert/Variable an dein Parameter
PHP:
$currentUser = 1234;
$req = $dbConnect->query($product);
$req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
$req->execute();
//TODO Mit fetch() über dieDaten iterieren
 
#18
Gemäss Doku zu PDO->prapare, muss ein execute folgen in dem die Paramter übergeben werden.
Oder schöner, du bindest vorher ein Wert/Variable an dein Parameter
PHP:
$currentUser = 1234;
$req = $dbConnect->query($product);
$req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
$req->execute();
//TODO Mit fetch() über dieDaten iterieren
danke für den Vorschlag, aber leider werden die variantes nicht sichbar, werden zwar erstellen aber nur in der Datenbank sichbar
 
#19
Hä? Dein Script von weiter oben erstellt gar nix in der Datenbank.
Wahrscheinlich hast du mein Beispiel falsch umgesetzt. Etwa in Zeile 37b432Hji443254. Ja, da müsste der Fehler sein,
 
#20
Hä? Dein Script von weiter oben erstellt gar nix in der Datenbank.
Wahrscheinlich hast du mein Beispiel falsch umgesetzt. Etwa in Zeile 37b432Hji443254. Ja, da müsste der Fehler sein,
so wurde es in meinem Script umgesetzt kann du noch mal bitte das ganze Script oben schauen
PHP:
<?php

require_once __DIR__ . '/connection.php';

$product = 'SELECT * FROM product WHERE id = '.$prodId;
$currentUser = 1234;
$req = $dbConnect->query($product);
$req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
$req->execute();
$prod    = $req->fetch(PDO::FETCH_ASSOC);


?>