1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

SQL-Anfrage

Dieses Thema im Forum "PHP" wurde erstellt von Henrigo007, 18. November 2016.

  1. Henrigo007

    Henrigo007 Mitglied

    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:
    1. $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
     
  2. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    Hi,

    bekommst vom SQL Fehlermeldungen? Welche Datenbank?

    Grüsse,
    BK
     
  3. Henrigo007

    Henrigo007 Mitglied

    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. Yaslaw

    Yaslaw n/a Moderator

    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
    Code (SQL):
    1. SELECT
    2.     id,
    3.     img_id,
    4.     user_id,
    5.     laeng_1,
    6.     laeng_2,
    7.     laeng_3,
    8.     laeng_4,
    9.     bem_1,
    10.     bem_2,
    11.     bem_3,
    12.     a,
    13.     b,
    14.     c,
    15.     d,
    16.     e,
    17.     al,
    18.     be
    19. FROM
    20.     variants
    21.     JOIN users USING(user_id)
    22. WHERE
    23.     user_id = :CURRENT_USER
    24.     OR user_id IN(
    25.          SELECT user_id
    26.          FROM users
    27.          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
     
  5. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    Hi,

    laut Google, erstes Ergebnis: http://stackoverflow.com/a/17274928/1164913

    In deinem SQL sind übrigens noch zwei Fehler drin:
    - Es fehlt eine schliessende Klammer
    - Die Abfrage auf ="admin"; ein String muss mit einfachen Anführungszeichen angegeben werden

    Grüsse,
    BK
     
  6. Henrigo007

    Henrigo007 Mitglied

    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: 18. November 2016
  7. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    Hi,

    Code (PHP):
    1. $variants = '
    2. SELECT
    3.    id, img_id,
    4.    user_id,
    5.    laeng_1,
    6.    laeng_2,
    7.    laeng_3,
    8.    laeng_4,
    9.    bem_1,
    10.    bem_2,
    11.    bem_3,
    12.    a,
    13.    b,
    14.    c,
    15.    d,
    16.    e,
    17.    al,
    18.    be
    19. FROM
    20.    variants
    21.    JOIN users USING(user_id)
    22. WHERE
    23.    user_id = :CURRENT_USER
    24.    OR user_id IN(
    25.         SELECT user_id
    26.         FROM users
    27.         WHERE ROLE = 'admin');
    Die ' von 'admin' müssen escaped werden.

    Grüsse,
    BK
     
  8. Henrigo007

    Henrigo007 Mitglied

    wo schliesst du die erste hochkomma?
     
  9. Henrigo007

    Henrigo007 Mitglied

    hier ist den Fehler Parse error: syntax error, unexpected 'admin' (T_STRING) in C:\xampp\htdocs\kant\variants.php on line 175
     
  10. cwriter

    cwriter Erfahrenes Mitglied

    Hi

    Sagt es doch schon:
    Wie @Bratkartoffel schon sagte: PHP kann nicht wissen, was jetzt der String ist.
    Den Code hat er ja von dir...

    Code (PHP):
    1. $variants = '
    2. SELECT
    3.   id, img_id,
    4.   user_id,
    5.   laeng_1,
    6.   laeng_2,
    7.   laeng_3,
    8.   laeng_4,
    9.   bem_1,
    10.   bem_2,
    11.   bem_3,
    12.   a,
    13.   b,
    14.   c,
    15.   d,
    16.   e,
    17.   al,
    18.   be
    19. FROM
    20.   variants
    21.   JOIN users USING(user_id)
    22. WHERE
    23.   user_id = :CURRENT_USER
    24.   OR user_id IN(
    25.        SELECT user_id
    26.        FROM users
    27.        WHERE ROLE = 'admin');'
    ist falsch, da php den String beim ''' vor dem 'a' beendet. Also entweder
    Code (PHP):
    1. $variants = '
    2. SELECT
    3.   id, img_id,
    4.   user_id,
    5.   laeng_1,
    6.   laeng_2,
    7.   laeng_3,
    8.   laeng_4,
    9.   bem_1,
    10.   bem_2,
    11.   bem_3,
    12.   a,
    13.   b,
    14.   c,
    15.   d,
    16.   e,
    17.   al,
    18.   be
    19. FROM
    20.   variants
    21.   JOIN users USING(user_id)
    22. WHERE
    23.   user_id = :CURRENT_USER
    24.   OR user_id IN(
    25.        SELECT user_id
    26.        FROM users
    27.        WHERE ROLE = \'admin\');'
    oder

    Code (PHP):
    1. $variants = "
    2. SELECT
    3.   id, img_id,
    4.   user_id,
    5.   laeng_1,
    6.   laeng_2,
    7.   laeng_3,
    8.   laeng_4,
    9.   bem_1,
    10.   bem_2,
    11.   bem_3,
    12.   a,
    13.   b,
    14.   c,
    15.   d,
    16.   e,
    17.   al,
    18.   be
    19. FROM
    20.   variants
    21.   JOIN users USING(user_id)
    22. WHERE
    23.   user_id = :CURRENT_USER
    24.   OR user_id IN(
    25.        SELECT user_id
    26.        FROM users
    27.        WHERE ROLE = 'admin');"
    (Siehe auch Highlighting hier im Forum... -> Grund, Codetags [code=php] [/code] zu verwenden)

    cwriter
     
  11. Henrigo007

    Henrigo007 Mitglied

    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
     
  12. cwriter

    cwriter Erfahrenes Mitglied

    Nein.
    http://php.net/manual/en/pdo.prepared-statements.php

    You don't say. Du hast ja den Parameter entfernt. :rolleyes:

    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?

    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. Henrigo007

    Henrigo007 Mitglied

    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: 21. November 2016
  14. cwriter

    cwriter Erfahrenes Mitglied

    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. Henrigo007

    Henrigo007 Mitglied

    hey cwriter,
    so sieht das script aus
    PHP:
    1. <?php
    2.  
    3. require_once __DIR__ . '/connection.php';
    4.  
    5. $product = 'SELECT * FROM product WHERE id = '.$prodId;
    6. $currentUser = 1234;
    7. $req = $dbConnect->query($product);
    8. $req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
    9. $req->execute();
    10. $prod    = $req->fetch(PDO::FETCH_ASSOC);
    11.  
    12.  
    13. ?>
    14.  
    15. <div id="produits">
    16.  
    17.   <div class="produit h-product" id="produit_<?php echo $prod['id'] ?>" align="center" style="margin-right:58%">
    18.         <form method="post" action="formular.php" autocomplete="off" name="<?php echo $prod['id'] ?>">
    19.             <input type="hidden" name="id" value="<?php echo $prod['id'] ?>">
    20.          <table border="0" cellpadding="0">
    21.                   <tr>
    22.             <td style="  color:#FFFFFF ; background-color:#860000; width:0%; height:13px; border:3px solid #860000;">PRODUKT</td>
    23.                   </tr>                  
    24.           <tr class="row9">
    25.                     <td class="column0 style24 null style27" colspan="4" rowspan="8">
    26.                         <img style=" z-index: 1; left: 40px; top: 10px; width: 220px; height: 220px;"
    27.                              src="images/<?php echo $prod['path'] ?>"><input type="hidden" name="selected_photo"
    28.                                                                              value="<?php echo $prod['path'] ?>"></td>
    29.                     <td class="column4 style10 s">a</td>
    30.                     <td class="column5 style19 n" style="font-size:15px"><input type="text" name="a" size="6" maxlength="4"  value="<?php echo $prod['a'] ?>"></td>
    31.  
    32.                 </tr>
    33.                 <tr class="row10">
    34.                     <td class="column4 style11 s">b</td>
    35.                     <td class="column5 style20 n" style="font-size:15px"><input type="text" name="b" size="6" maxlength="4"  value="<?php echo $prod['b'] ?>"></td>
    36.  
    37.                 </tr>
    38.                 <tr class="row11">
    39.                     <td class="column4 style11 s">c</td>
    40.                     <td class="column5 style20 null" style="font-size:15px"><input type="text" name="c" size="6" maxlength="4"  value="<?php echo $prod['c'] ?>">
    41.                     </td>
    42.  
    43.                 </tr>
    44.                 <tr class="row12">
    45.                     <td class="column4 style11 s">d</td>
    46.                     <td class="column5 style20 null" style="font-size:15px"><input type="text" name="d" size="6" maxlength="4"  value="<?php echo $prod['d'] ?>">
    47.                     </td>
    48.  
    49.                 </tr>
    50.                 <tr class="row13">
    51.                     <td class="column4 style11 s">e</td>
    52.                     <td class="column5 style20 null" style="font-size:15px"><input type="text" name="e" size="6" maxlength="4"  value="<?php echo $prod['e'] ?>">
    53.                     </td>
    54.  
    55.                 </tr>
    56.             <tr class="row17" >
    57.                     <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>
    58.                     <td class="column1 style40 n style42" colspan="2"></td>
    59.                     <td class="column3 style15 s" style="font-weight:bold">
    60.                     <input type="checkbox" name="variant"> Ajouter une Variante </td>
    61.                     <td class="column4 style40 n style41" colspan="2">
    62.                     <input type="submit" name="save_product" value="Sauvegarder">
    63.                     </td>
    64.                 </tr>  
    65.        
    66.                 </tbody>
    67.             </table>
    68.         </form>
    69.     </div>  
    70.  
    71. <?php
    72.    
    73.   // Variante
    74. $variants = '
    75. SELECT
    76.   id,
    77.   img_id,
    78.   user_id,
    79.   a,
    80.   b,
    81.   c,
    82.   d,
    83.   e
    84. FROM
    85.   variants
    86.   JOIN users USING(user_id)
    87. WHERE
    88.   user_id = :CURRENT_USER
    89.   OR user_id IN(
    90.        SELECT user_id
    91.        FROM users
    92.        WHERE ROLE = \'admin\');';
    93.  
    94.     $req2 = $dbConnect->prepare($variants);
    95.  
    96.     while ($variant = $req2->fetch(PDO::FETCH_ASSOC)) {
    97.    
    98.     ?>
    99.         <div class="produit" id="produit_<?php echo $variant['id'] ?>" align="center" style="margin-right:68%">
    100.             <form method="post" action="formular.php" name="<?php echo $variant['id'] ?>">
    101.                 <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
    102.                 <table border="0" cellpadding="0">  
    103.         <td style="  color:#FFFFFF ; background-color:#004B27; width:0%; height:13px; border:3px solid #004B27;">VARIANTE</td>
    104.        
    105.         <tr class="row9">
    106.                         <td class="column0 style24 null style27" colspan="4" rowspan="8">
    107.                             <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>
    108.                         <td class="column4 style10 s">a</td>
    109.                         <td class="column5 style19 n"style="font-size:15px"><input type="text" name="a" size="6" maxlength="4" value="<?php echo $variant['a'] ?>" ></td>
    110.  
    111.                     </tr>
    112.                     <tr class="row10">
    113.                         <td class="column4 style11 s">b</td>
    114.                         <td class="column5 style20 n"style="font-size:15px"><input type="text" name="b" size="6" maxlength="4" value="<?php echo $variant['b'] ?>" ></td>
    115.  
    116.                     </tr>
    117.                     <tr class="row11">
    118.                         <td class="column4 style11 s">c</td>
    119.                         <td class="column5 style20 null"style="font-size:15px"><input type="text" name="c" size="6" maxlength="4" value="<?php echo $variant['c'] ?>" ></td>
    120.  
    121.                     </tr>
    122.                     <tr class="row12">
    123.                         <td class="column4 style11 s">d</td>
    124.                         <td class="column5 style20 null"style="font-size:15px"><input type="text" name="d" size="6" maxlength="4" value="<?php echo $variant['d'] ?>" ></td>
    125.  
    126.                     </tr>
    127.                     <tr class="row13">
    128.                         <td class="column4 style11 s">e</td>
    129.                         <td class="column5 style20 null" style="font-size:15px"><input type="text" name="e" size="6" maxlength="4" value="<?php echo $variant['e'] ?>" ></td>
    130.  
    131.                     </tr>
    132.          
    133.                
    134.                     <tr class="row17">
    135.                         <td class="column0 style14 s" style="font-size:14px; text-align:center;font-weight:bold">
    136.  
    137.                             <input type="reset" name="daten_loeschen" value="Zurücksetzen">
    138.  
    139.                             </td>
    140.                         <td class="column1 style40 n style42" colspan="2">
    141.  
    142.                         </td>
    143.                         <td class="column3 style15 s">
    144.                         </td>
    145.                         <td class="column4 style40 n style41" colspan="2">
    146.                         <input type="submit" name="save_variant" value="Speichern">
    147.                         </td>
    148.                     </tr>
    149.              
    150.  
    151.                     </form>
    152.  
    153.                    <tr class="row17">
    154.                         <td class="column0 style14 s"></td>
    155.  
    156.                         <td class="column1 style40 n style42" colspan="2">
    157.                        
    158.                          <form method="post" action="delete_variant.php" name="delete_<?php echo $variant['id'] ?>">
    159.                             <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
    160.                             <input type="hidden" name="img_id" value="<?php echo $prod['id'] ?>">
    161.                             <input type="hidden" name="img_path" value="<?php echo $prod['path'] ?>">
    162.                             <input type="hidden" name="type" value="variant">
    163.                             <input type="hidden" name="location" value="<?php echo $_SERVER['REQUEST_URI'] ?>">
    164.                             <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id'] ?>">
    165.                             <input type="hidden" name="sessionID" value="<?php echo $_SESSION['sessionID'] ?>">
    166.                             <input type="hidden" name="time" value="<?php echo $_SESSION['time'] ?>">
    167.                             <input type="submit" name="select_variant" value="Löschen" style="align:center">
    168.                         </form>
    169.                      
    170.                         </td>
    171.                         <td class="column3 style15 s" style="font-size:14px; text-align:center;font-weight:bold">
    172.                         <form method="post" action="drucker.php" name="<?php echo $variant['id'] ?>">
    173.                             <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
    174.                             <input type="hidden" name="img_id" value="<?php echo $prod['id'] ?>">
    175.                             <input type="hidden" name="img_path" value="<?php echo $prod['path'] ?>">
    176.                             <input type="hidden" name="type" value="variant">
    177.                             <input type="hidden" name="location" value="<?php echo $_SERVER['REQUEST_URI'] ?>">
    178.                             <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id'] ?>">
    179.                             <input type="hidden" name="sessionID" value="<?php echo $_SESSION['sessionID'] ?>">
    180.                             <input type="hidden" name="time" value="<?php echo $_SESSION['time'] ?>">
    181.                             <input type="submit" name="select_variant" value="Auswählen" style="align:center">
    182.                         </form>
    183.                         </td>
    184.                         <td class="column4 style40 n style41" colspan="2">
    185.                         </td>
    186.                     </tr>
    187.                     </tbody>
    188.                 </table>
    189.  
    190.         </div>
    191.         <?php
    192.        
    193.     }
    194.  
    195. ?>
     
    Zuletzt bearbeitet: 21. November 2016
  16. cwriter

    cwriter Erfahrenes Mitglied

    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. Yaslaw

    Yaslaw n/a Moderator

    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
    Code (PHP):
    1. $currentUser = 1234;
    2. $req = $dbConnect->query($product);
    3. $req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
    4. $req->execute();
    5. //TODO Mit fetch() über dieDaten iterieren
     
  18. Henrigo007

    Henrigo007 Mitglied

    danke für den Vorschlag, aber leider werden die variantes nicht sichbar, werden zwar erstellen aber nur in der Datenbank sichbar
     
  19. Yaslaw

    Yaslaw n/a Moderator

    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. Henrigo007

    Henrigo007 Mitglied

    so wurde es in meinem Script umgesetzt kann du noch mal bitte das ganze Script oben schauen
    PHP:
    1. <?php
    2.  
    3. require_once __DIR__ . '/connection.php';
    4.  
    5. $product = 'SELECT * FROM product WHERE id = '.$prodId;
    6. $currentUser = 1234;
    7. $req = $dbConnect->query($product);
    8. $req->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
    9. $req->execute();
    10. $prod    = $req->fetch(PDO::FETCH_ASSOC);
    11.  
    12.  
    13. ?>
     
Die Seite wird geladen...