3v4l.org

run code in 300+ PHP versions simultaneously
<!DOCTYPE html> <!-- Cette page permet l'ajout d'un objet --> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!-- formulaire ajout objet --> <?php // initialisation de OK if(!isset($_POST['ok'])) $ok=""; else $ok=$_POST['ok']; if(isset($_POST['valider'])) { if(empty($_POST['libObjet'])) { echo 'Veuillez remplir le libellé<br>'; $ok = ""; } if(empty($_POST['nbSortie']) AND empty($_POST['nbEntree'])) { echo 'L\'objet doit avoir au moins une entrée ou une sortie<br>' ; $ok = ""; } // OK ssi tout est valide if(!empty($_POST['libObjet']) AND !empty($_POST['typeObjet']) AND (!empty($_POST['nbEntree']) OR !empty($_POST['nbSortie']))) { $ok = 'ok'; } // Permet l'ajout d'un objet à la base if(isset($_POST['valider']) AND $ok == 'ok') { require_once 'includes/inc_connect.php'; print_r($_POST); connectdb(); // on récupère les variables $strLibObjet = htmlentities($_POST["libObjet"]); $strTypeObjet = htmlentities($_POST["typeObjet"]); $nbEntree = htmlentities($_POST["nbEntree"]); $nbSortie = htmlentities($_POST["nbSortie"]); $strSalle = htmlentities($_POST["noSalle"]); $noArmoire = ($_POST["noArmoire"] > 0) ? htmlentities($_POST["noArmoire"]) : ''; // condition ternaire // requête qui envoie les données $sql = "INSERT INTO objet (id_obj, lib_obj, nb_entree, nb_sortie, salle, type_obj, no_armoire) VALUES('', '$strLibObjet', '$nbEntree', '$nbSortie', '$strSalle', '$strTypeObjet', '$noArmoire')"; echo $sql."<br>"; $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // message if($req) { echo 'executé avec succès'; } else { echo 'problème'; } mysql_close(); } } // FORMULAIRE if(!isset($_POST['valider']) OR $ok == "") { ?><form action="ajout.php" method="post" class="formAjout"> <div> <label for="libObjet"><br>libellé de l'objet :</label> <input type="text" name="libObjet" id="libObjet" value=""/> </div> <div> <label for="typeObjet">Type de l'objet :</label> <select name="typeObjet"> <?php require_once 'includes/inc_connect.php'; connectdb(); $req = "SELECT lib_type, designation_type FROM type"; $result = mysql_query($req); while ($reqType = mysql_fetch_assoc($result)) { echo "<option value=$reqType[lib_type]>$reqType[designation_type]</option>"; } mysql_close(); ?> </select> </div> <div> <label for="nbEntree">Nombre de port en entrée :</label> <input type="number" name="nbEntree" id ="nbEntree" step="1" value="null" min="0" max="500"/> </div> <div> <label for="nbSortie">Nombre de port en sortie :</label> <input type="number" name="nbSortie" id="nbSortie" step="1" value="null" min="0" max="500"/> </div> <div> <label for="noSalle">N° de la salle</label> <select name="noSalle"> <?php require_once 'includes/inc_connect.php'; connectdb(); $req = "SELECT no_salle FROM salle"; $result = mysql_query($req); while ($reqSalle = mysql_fetch_assoc($result)) { echo "<option value=$reqSalle[no_salle]>$reqSalle[no_salle]</option>"; } mysql_close(); ?> </select> </div> <div> <label for="noArmoire">N° de l'armoire</label> <input type="number" name="noArmoire" id="noArmoire" step="1" min="0" max="20" value="null"/> </div> <input type="submit" name="valider" value="Ajouter" /> <input type="hidden" name="ok" value="ok" /> </form> <?php } ?> </body> </html>
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 5, Position 2 = 7
Branch analysis from position: 5
1 jumps found. (Code = 42) Position 1 = 10
Branch analysis from position: 10
2 jumps found. (Code = 43) Position 1 = 13, Position 2 = 137
Branch analysis from position: 13
2 jumps found. (Code = 43) Position 1 = 16, Position 2 = 18
Branch analysis from position: 16
2 jumps found. (Code = 46) Position 1 = 21, Position 2 = 24
Branch analysis from position: 21
2 jumps found. (Code = 43) Position 1 = 25, Position 2 = 27
Branch analysis from position: 25
2 jumps found. (Code = 46) Position 1 = 31, Position 2 = 35
Branch analysis from position: 31
2 jumps found. (Code = 46) Position 1 = 36, Position 2 = 45
Branch analysis from position: 36
2 jumps found. (Code = 47) Position 1 = 40, Position 2 = 44
Branch analysis from position: 40
2 jumps found. (Code = 43) Position 1 = 46, Position 2 = 47
Branch analysis from position: 46
2 jumps found. (Code = 46) Position 1 = 50, Position 2 = 52
Branch analysis from position: 50
2 jumps found. (Code = 43) Position 1 = 53, Position 2 = 137
Branch analysis from position: 53
2 jumps found. (Code = 43) Position 1 = 94, Position 2 = 101
Branch analysis from position: 94
1 jumps found. (Code = 42) Position 1 = 102
Branch analysis from position: 102
2 jumps found. (Code = 47) Position 1 = 124, Position 2 = 131
Branch analysis from position: 124
1 jumps found. (Code = 79) Position 1 = -2
Branch analysis from position: 131
2 jumps found. (Code = 43) Position 1 = 132, Position 2 = 134
Branch analysis from position: 132
1 jumps found. (Code = 42) Position 1 = 135
Branch analysis from position: 135
2 jumps found. (Code = 47) Position 1 = 141, Position 2 = 143
Branch analysis from position: 141
2 jumps found. (Code = 43) Position 1 = 144, Position 2 = 195
Branch analysis from position: 144
1 jumps found. (Code = 42) Position 1 = 162
Branch analysis from position: 162
2 jumps found. (Code = 44) Position 1 = 167, Position 2 = 154
Branch analysis from position: 167
1 jumps found. (Code = 42) Position 1 = 187
Branch analysis from position: 187
2 jumps found. (Code = 44) Position 1 = 192, Position 2 = 179
Branch analysis from position: 192
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 179
2 jumps found. (Code = 44) Position 1 = 192, Position 2 = 179
Branch analysis from position: 192
Branch analysis from position: 179
Branch analysis from position: 154
2 jumps found. (Code = 44) Position 1 = 167, Position 2 = 154
Branch analysis from position: 167
Branch analysis from position: 154
Branch analysis from position: 195
Branch analysis from position: 143
Branch analysis from position: 134
2 jumps found. (Code = 47) Position 1 = 141, Position 2 = 143
Branch analysis from position: 141
Branch analysis from position: 143
Branch analysis from position: 101
2 jumps found. (Code = 47) Position 1 = 124, Position 2 = 131
Branch analysis from position: 124
Branch analysis from position: 131
Branch analysis from position: 137
Branch analysis from position: 52
Branch analysis from position: 47
Branch analysis from position: 44
Branch analysis from position: 45
Branch analysis from position: 35
Branch analysis from position: 27
Branch analysis from position: 24
Branch analysis from position: 18
Branch analysis from position: 137
Branch analysis from position: 7
2 jumps found. (Code = 43) Position 1 = 13, Position 2 = 137
Branch analysis from position: 13
Branch analysis from position: 137
filename:       /in/7OE7X
function name:  (null)
number of ops:  197
compiled vars:  !0 = $ok, !1 = $strLibObjet, !2 = $strTypeObjet, !3 = $nbEntree, !4 = $nbSortie, !5 = $strSalle, !6 = $noArmoire, !7 = $sql, !8 = $req, !9 = $result, !10 = $reqType, !11 = $reqSalle
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    1     0  E >   ECHO                                                     '%3C%21DOCTYPE+html%3E%0A%3C%21--%0ACette+page+permet+l%27ajout+d%27un+objet%0A--%3E%0A%3Chtml%3E%0A++++%3Chead%3E%0A++++++++%3Cmeta+charset%3D%22UTF-8%22%3E%0A++++++++%3Ctitle%3E%3C%2Ftitle%3E%0A++++%3C%2Fhead%3E%0A++++%3Cbody%3E%0A++++++++%0A++++++++%3C%21--+formulaire+ajout+objet+--%3E%0A++++++++'
   15     1        FETCH_IS                                         ~12     '_POST'
          2        ISSET_ISEMPTY_DIM_OBJ                         0  ~13     ~12, 'ok'
          3        BOOL_NOT                                         ~14     ~13
          4      > JMPZ                                                     ~14, ->7
          5    >   ASSIGN                                                   !0, ''
          6      > JMP                                                      ->10
          7    >   FETCH_R                      global              ~16     '_POST'
          8        FETCH_DIM_R                                      ~17     ~16, 'ok'
          9        ASSIGN                                                   !0, ~17
   17    10    >   FETCH_IS                                         ~19     '_POST'
         11        ISSET_ISEMPTY_DIM_OBJ                         0          ~19, 'valider'
         12      > JMPZ                                                     ~20, ->137
   19    13    >   FETCH_IS                                         ~21     '_POST'
         14        ISSET_ISEMPTY_DIM_OBJ                         1          ~21, 'libObjet'
         15      > JMPZ                                                     ~22, ->18
   21    16    >   ECHO                                                     'Veuillez+remplir+le+libell%C3%A9%3Cbr%3E'
   22    17        ASSIGN                                                   !0, ''
   25    18    >   FETCH_IS                                         ~24     '_POST'
         19        ISSET_ISEMPTY_DIM_OBJ                         1  ~25     ~24, 'nbSortie'
         20      > JMPZ_EX                                          ~25     ~25, ->24
         21    >   FETCH_IS                                         ~26     '_POST'
         22        ISSET_ISEMPTY_DIM_OBJ                         1  ~27     ~26, 'nbEntree'
         23        BOOL                                             ~25     ~27
         24    > > JMPZ                                                     ~25, ->27
   27    25    >   ECHO                                                     'L%27objet+doit+avoir+au+moins+une+entr%C3%A9e+ou+une+sortie%3Cbr%3E'
   28    26        ASSIGN                                                   !0, ''
   32    27    >   FETCH_IS                                         ~29     '_POST'
         28        ISSET_ISEMPTY_DIM_OBJ                         1  ~30     ~29, 'libObjet'
         29        BOOL_NOT                                         ~31     ~30
         30      > JMPZ_EX                                          ~31     ~31, ->35
         31    >   FETCH_IS                                         ~32     '_POST'
         32        ISSET_ISEMPTY_DIM_OBJ                         1  ~33     ~32, 'typeObjet'
         33        BOOL_NOT                                         ~34     ~33
         34        BOOL                                             ~31     ~34
         35    > > JMPZ_EX                                          ~31     ~31, ->45
         36    >   FETCH_IS                                         ~35     '_POST'
         37        ISSET_ISEMPTY_DIM_OBJ                         1  ~36     ~35, 'nbEntree'
         38        BOOL_NOT                                         ~37     ~36
         39      > JMPNZ_EX                                         ~37     ~37, ->44
         40    >   FETCH_IS                                         ~38     '_POST'
         41        ISSET_ISEMPTY_DIM_OBJ                         1  ~39     ~38, 'nbSortie'
         42        BOOL_NOT                                         ~40     ~39
         43        BOOL                                             ~37     ~40
         44    >   BOOL                                             ~31     ~37
         45    > > JMPZ                                                     ~31, ->47
   34    46    >   ASSIGN                                                   !0, 'ok'
   38    47    >   FETCH_IS                                         ~42     '_POST'
         48        ISSET_ISEMPTY_DIM_OBJ                         0  ~43     ~42, 'valider'
         49      > JMPZ_EX                                          ~43     ~43, ->52
         50    >   IS_EQUAL                                         ~44     !0, 'ok'
         51        BOOL                                             ~43     ~44
         52    > > JMPZ                                                     ~43, ->137
   40    53    >   INCLUDE_OR_EVAL                                          'includes%2Finc_connect.php', REQUIRE_ONCE
   41    54        INIT_FCALL                                               'print_r'
         55        FETCH_R                      global              ~46     '_POST'
         56        SEND_VAL                                                 ~46
         57        DO_ICALL                                                 
   42    58        INIT_FCALL_BY_NAME                                       'connectdb'
         59        DO_FCALL                                      0          
   45    60        INIT_FCALL                                               'htmlentities'
         61        FETCH_R                      global              ~49     '_POST'
         62        FETCH_DIM_R                                      ~50     ~49, 'libObjet'
         63        SEND_VAL                                                 ~50
         64        DO_ICALL                                         $51     
         65        ASSIGN                                                   !1, $51
   46    66        INIT_FCALL                                               'htmlentities'
         67        FETCH_R                      global              ~53     '_POST'
         68        FETCH_DIM_R                                      ~54     ~53, 'typeObjet'
         69        SEND_VAL                                                 ~54
         70        DO_ICALL                                         $55     
         71        ASSIGN                                                   !2, $55
   47    72        INIT_FCALL                                               'htmlentities'
         73        FETCH_R                      global              ~57     '_POST'
         74        FETCH_DIM_R                                      ~58     ~57, 'nbEntree'
         75        SEND_VAL                                                 ~58
         76        DO_ICALL                                         $59     
         77        ASSIGN                                                   !3, $59
   48    78        INIT_FCALL                                               'htmlentities'
         79        FETCH_R                      global              ~61     '_POST'
         80        FETCH_DIM_R                                      ~62     ~61, 'nbSortie'
         81        SEND_VAL                                                 ~62
         82        DO_ICALL                                         $63     
         83        ASSIGN                                                   !4, $63
   49    84        INIT_FCALL                                               'htmlentities'
         85        FETCH_R                      global              ~65     '_POST'
         86        FETCH_DIM_R                                      ~66     ~65, 'noSalle'
         87        SEND_VAL                                                 ~66
         88        DO_ICALL                                         $67     
         89        ASSIGN                                                   !5, $67
   50    90        FETCH_R                      global              ~69     '_POST'
         91        FETCH_DIM_R                                      ~70     ~69, 'noArmoire'
         92        IS_SMALLER                                               0, ~70
         93      > JMPZ                                                     ~71, ->101
         94    >   INIT_FCALL                                               'htmlentities'
         95        FETCH_R                      global              ~72     '_POST'
         96        FETCH_DIM_R                                      ~73     ~72, 'noArmoire'
         97        SEND_VAL                                                 ~73
         98        DO_ICALL                                         $74     
         99        QM_ASSIGN                                        ~75     $74
        100      > JMP                                                      ->102
        101    >   QM_ASSIGN                                        ~75     ''
        102    >   ASSIGN                                                   !6, ~75
   53   103        ROPE_INIT                                    13  ~78     'INSERT+INTO+objet+%28id_obj%2C+lib_obj%2C+nb_entree%2C+nb_sortie%2C+salle%2C+type_obj%2C+no_armoire%29+VALUES%28%27%27%2C+%27'
        104        ROPE_ADD                                      1  ~78     ~78, !1
        105        ROPE_ADD                                      2  ~78     ~78, '%27%2C+%27'
        106        ROPE_ADD                                      3  ~78     ~78, !3
        107        ROPE_ADD                                      4  ~78     ~78, '%27%2C+%27'
        108        ROPE_ADD                                      5  ~78     ~78, !4
        109        ROPE_ADD                                      6  ~78     ~78, '%27%2C+%27'
        110        ROPE_ADD                                      7  ~78     ~78, !5
        111        ROPE_ADD                                      8  ~78     ~78, '%27%2C+%27'
        112        ROPE_ADD                                      9  ~78     ~78, !2
        113        ROPE_ADD                                     10  ~78     ~78, '%27%2C+%27'
        114        ROPE_ADD                                     11  ~78     ~78, !6
        115        ROPE_END                                     12  ~77     ~78, '%27%29'
        116        ASSIGN                                                   !7, ~77
   54   117        CONCAT                                           ~86     !7, '%3Cbr%3E'
        118        ECHO                                                     ~86
   55   119        INIT_FCALL_BY_NAME                                       'mysql_query'
        120        SEND_VAR_EX                                              !7
        121        DO_FCALL                                      0  $87     
        122        ASSIGN                                           ~88     !8, $87
        123      > JMPNZ_EX                                         ~88     ~88, ->131
        124    >   CONCAT                                           ~89     'Erreur+SQL+%21%3Cbr+%2F%3E', !7
        125        CONCAT                                           ~90     ~89, '%3Cbr+%2F%3E'
        126        INIT_FCALL_BY_NAME                                       'mysql_error'
        127        DO_FCALL                                      0  $91     
        128        CONCAT                                           ~92     ~90, $91
        129      > EXIT                                                     ~92
        130*       BOOL                                             ~88     <true>
   58   131    > > JMPZ                                                     !8, ->134
   60   132    >   ECHO                                                     'execut%C3%A9+avec+succ%C3%A8s'
        133      > JMP                                                      ->135
   64   134    >   ECHO                                                     'probl%C3%A8me'
   67   135    >   INIT_FCALL_BY_NAME                                       'mysql_close'
        136        DO_FCALL                                      0          
   72   137    >   FETCH_IS                                         ~94     '_POST'
        138        ISSET_ISEMPTY_DIM_OBJ                         0  ~95     ~94, 'valider'
        139        BOOL_NOT                                         ~96     ~95
        140      > JMPNZ_EX                                         ~96     ~96, ->143
        141    >   IS_EQUAL                                         ~97     !0, ''
        142        BOOL                                             ~96     ~97
        143    > > JMPZ                                                     ~96, ->195
   74   144    >   ECHO                                                     '%3Cform+action%3D%22ajout.php%22+method%3D%22post%22+class%3D%22formAjout%22%3E%0A++++++++++++++++++++%3Cdiv%3E%0A++++++++++++++++++++++++%3Clabel+for%3D%22libObjet%22%3E%3Cbr%3Elibell%C3%A9+de+l%27objet+%3A%3C%2Flabel%3E%0A++++++++++++++++++++++++%3Cinput+type%3D%22text%22+name%3D%22libObjet%22+id%3D%22libObjet%22+value%3D%22%22%2F%3E%0A++++++++++++++++++++%3C%2Fdiv%3E%0A++++++++++++++++++++%3Cdiv%3E%0A++++++++++++++++++++++++%3Clabel+for%3D%22typeObjet%22%3EType+de+l%27objet+%3A%3C%2Flabel%3E%0A++++++++++++++++++++++++%3Cselect+name%3D%22typeObjet%22%3E%0A++++++++++++++++++++++++++++'
   83   145        INCLUDE_OR_EVAL                                          'includes%2Finc_connect.php', REQUIRE_ONCE
   84   146        INIT_FCALL_BY_NAME                                       'connectdb'
        147        DO_FCALL                                      0          
   86   148        ASSIGN                                                   !8, 'SELECT+lib_type%2C+designation_type+FROM+type'
   87   149        INIT_FCALL_BY_NAME                                       'mysql_query'
        150        SEND_VAR_EX                                              !8
        151        DO_FCALL                                      0  $101    
        152        ASSIGN                                                   !9, $101
   88   153      > JMP                                                      ->162
   90   154    >   ROPE_INIT                                     5  ~106    '%3Coption+value%3D'
        155        FETCH_DIM_R                                      ~103    !10, 'lib_type'
        156        ROPE_ADD                                      1  ~106    ~106, ~103
        157        ROPE_ADD                                      2  ~106    ~106, '%3E'
        158        FETCH_DIM_R                                      ~104    !10, 'designation_type'
        159        ROPE_ADD                                      3  ~106    ~106, ~104
        160        ROPE_END                                      4  ~105    ~106, '%3C%2Foption%3E'
        161        ECHO                                                     ~105
   88   162    >   INIT_FCALL_BY_NAME                                       'mysql_fetch_assoc'
        163        SEND_VAR_EX                                              !9
        164        DO_FCALL                                      0  $109    
        165        ASSIGN                                           ~110    !10, $109
        166      > JMPNZ                                                    ~110, ->154
   93   167    >   INIT_FCALL_BY_NAME                                       'mysql_close'
        168        DO_FCALL                                      0          
   95   169        ECHO                                                     '++++++++++++++++++++++++%3C%2Fselect%3E%0A++++++++++++++++++++%3C%2Fdiv%3E%0A++++++++++++++++++++%3Cdiv%3E%0A++++++++++++++++++++++++%0A++++++++++++++++++++++++%3Clabel+for%3D%22nbEntree%22%3ENombre+de+port+en+entr%C3%A9e+%3A%3C%2Flabel%3E%0A++++++++++++++++++++++++%3Cinput+type%3D%22number%22+name%3D%22nbEntree%22+id+%3D%22nbEntree%22+step%3D%221%22+value%3D%22null%22+min%3D%220%22+max%3D%22500%22%2F%3E%0A++++++++++++++++++++%3C%2Fdiv%3E%0A++++++++++++++++++++%3Cdiv%3E%0A++++++++++++++++++++++++%3Clabel+for%3D%22nbSortie%22%3ENombre+de+port+en+sortie+%3A%3C%2Flabel%3E%0A++++++++++++++++++++++++%3Cinput+type%3D%22number%22+name%3D%22nbSortie%22+id%3D%22nbSortie%22+step%3D%221%22+value%3D%22null%22+min%3D%220%22+max%3D%22500%22%2F%3E%0A++++++++++++++++++++%3C%2Fdiv%3E%0A++++++++++++++++++++%3Cdiv%3E%0A++++++++++++++++++++++++%3Clabel+for%3D%22noSalle%22%3EN%C2%B0+de+la+salle%3C%2Flabel%3E%0A++++++++++++++++++++++++%3Cselect+name%3D%22noSalle%22%3E%0A++++++++++++++++++++++++++++'
  110   170        INCLUDE_OR_EVAL                                          'includes%2Finc_connect.php', REQUIRE_ONCE
  111   171        INIT_FCALL_BY_NAME                                       'connectdb'
        172        DO_FCALL                                      0          
  113   173        ASSIGN                                                   !8, 'SELECT+no_salle+FROM+salle'
  114   174        INIT_FCALL_BY_NAME                                       'mysql_query'
        175        SEND_VAR_EX                                              !8
        176        DO_FCALL                                      0  $115    
        177        ASSIGN                                                   !9, $115
  115   178      > JMP                                                      ->187
  117   179    >   ROPE_INIT                                     5  ~120    '%3Coption+value%3D'
        180        FETCH_DIM_R                                      ~117    !11, 'no_salle'
        181        ROPE_ADD                                      1  ~120    ~120, ~117
        182        ROPE_ADD                                      2  ~120    ~120, '%3E'
        183        FETCH_DIM_R                                      ~118    !11, 'no_salle'
        184        ROPE_ADD                                      3  ~120    ~120, ~118
        185        ROPE_END                                      4  ~119    ~120, '%3C%2Foption%3E'
        186        ECHO                                                     ~119
  115   187    >   INIT_FCALL_BY_NAME                                       'mysql_fetch_assoc'
        188        SEND_VAR_EX                                              !9
        189        DO_FCALL                                      0  $123    
        190        ASSIGN                                           ~124    !11, $123
        191      > JMPNZ                                                    ~124, ->179
  120   192    >   INIT_FCALL_BY_NAME                                       'mysql_close'
        193        DO_FCALL                                      0          
  122   194        ECHO                                                     '++++++++++++++++++++++++%3C%2Fselect%3E%0A++++++++++++++++++++%3C%2Fdiv%3E%0A++++++++++++++++++++%3Cdiv%3E%0A++++++++++++++++++++++++%3Clabel+for%3D%22noArmoire%22%3EN%C2%B0+de+l%27armoire%3C%2Flabel%3E%0A++++++++++++++++++++++++%3Cinput+type%3D%22number%22+name%3D%22noArmoire%22+id%3D%22noArmoire%22+step%3D%221%22+min%3D%220%22+max%3D%2220%22+value%3D%22null%22%2F%3E%0A++++++++++++++++++++%3C%2Fdiv%3E%0A++++++++++++++++++++%3Cinput+type%3D%22submit%22+name%3D%22valider%22+value%3D%22Ajouter%22+%2F%3E%0A++++++++++++++++++++%3Cinput+type%3D%22hidden%22+name%3D%22ok%22+value%3D%22ok%22+%2F%3E%0A++++++++++++%3C%2Fform%3E%0A++++++++'
  134   195    >   ECHO                                                     '++++%3C%2Fbody%3E%0A%3C%2Fhtml%3E'
  135   196      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
148.05 ms | 1416 KiB | 17 Q