2016-02-05 93 views
0

我想通過他的ID從數據庫打印用戶名。我希望通過將其輸入到輸入表單來選擇id,但它不起作用。任何線索爲什麼?通過從MySQL打印用戶名通過php

<div> 
     <p><u>Anzeigen eines Users mit Eingebafeld für die id</u></p> 
     <form method="post1" > 
     <p>Zu suchende id:</p> <input type="text" name="id" class="form-control"><br> 
     <input type="submit" name="Buttonid" value="Suchen" class="btn btn-primary" > 
    </form> 
    </div> 
    <div> 
    <?php 
     /*ini_set('display_errors', 0);*/ 
     $mysqli = new mysqli("localhost", "test", "test", "test"); 
     if ($mysqli->connect_errno) { 
     print "Failed to connect to MySQL: " . $mysqli->connect_error; 
     } 
     $id = @$_POST1; 
     $res = $mysqli->query("SELECT username FROM user WHERE id = $id"); 
     $row = $res->fetch_assoc(); 
     print '<p>' . $row['username'] .'</p>'; 
    ?> 
    </div> 
    </div> 
+0

在'

''中做什麼'post1'? –

+1

你能指定你的意思嗎? – Pingbeat

+0

''form method =「post1」>'應該是''form method =「POST」>'和'$ id = @ $ _ POST1;'應該是'$ id = $ _POST ['id'];' – Qirel

回答

0

最有可能你想是這樣的:

<div> 
     <p><u>Anzeigen eines Users mit Eingebafeld für die id</u></p> 
     <form method="post" > 
     <p>Zu suchende id:</p> <input type="text" name="id" class="form-control"><br> 
     <input type="submit" name="Buttonid" value="Suchen" class="btn btn-primary" > 
    </form> 
    </div> 
    <div> 
    <?php 
     /*ini_set('display_errors', 0);*/ 
     if (isset($_POST['id'])){ 
     $mysqli = new mysqli("localhost", "test", "test", "test"); 
     if ($mysqli->connect_errno) { 
      print "Failed to connect to MySQL: " . $mysqli->connect_error; 
     } 
     $id = $mysqli->real_escape_string($_POST['id']); 
     $res = $mysqli->query("SELECT username FROM user WHERE id = $id"); 
     $row = $res->fetch_assoc(); 
     print '<p>' . html_entities($row['username']) .'</p>'; 
     } 
    ?> 
    </div> 
    </div> 

注意的變化:

  • POST1 - >發表
  • @$POST1 - >$_POST['id'],不知道你在那裏看到這個奇怪的代碼..
  • real_escape_string讓sur輸入的id不是SQL注入,也可以將其轉換爲int。
  • 添加html_entities以確保用戶名是XSS安全的。

當窗體的方法設置爲post時,窗體中的變量將被捕獲到$_POST數組中。另請注意,我檢查這個數組是否具有id的值,因爲即使表單尚未提交,php代碼也會在表單加載時執行。

+2

一個很好的答案可以解釋發生了什麼變化,以及*爲什麼會改變它 - 這樣的代碼很可能不會學習任何人,即使使用這些代碼解決了他們的問題。 – Qirel

+0

@Qirel,仍在編輯,給我幾分鐘。 –

+0

不用擔心,我會仔細查看改變了什麼,因爲我需要了解它。 – Pingbeat

1

你真的需要小心$_POST並清理那裏的所有爛攤子。也可以使用準備好的語句,但這是一個很好的解決方案,確保安全並正常工作。

<?php 
     /*ini_set('display_errors', 0);*/ 
    $mysqli = new mysqli("localhost", "test", "test", "test"); 
    if ($mysqli->connect_errno) { 
    die("Failed to connect to MySQL: " . $mysqli->connect_error); 
    } 
    if(isset($_POST['id']) && !empty($_POST['id'])) 
    { 
     $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT, array(
       'options' => array(
       'default' => 0 
      ); 
     // to be shure that is number 
     $id = preg_replace("/[^0-9]/Ui", "", $id); 

     $res = $mysqli->query("SELECT username FROM user WHERE id = {$id} LIMIT 1;"); 
     $row = $res->fetch_assoc(); 
     if(isset($row['username']) && !empty($row['username'])) 
      print '<p>' . $row['username'] .'</p>'; 
     else 
      print '<p>No username</p>'; 
    } 
?> 

不理想,但你會明白,我只是改變你的代碼。

+1

'$ id =((int)$ _ POST ['id']);'that that should理論上讀爲'(int)$ _ POST ['id']',因爲這可能會失敗。另外,對於可能輸入的字符串,「int」不是最好的測試。例如'a123'將以'(int)'的形式傳遞。最好使用'ctype_alnum()'恕我直言。 http://php.net/manual/en/function.ctype-alnum.php –

+0

確定這是真的,但可以使用'filter_input()'來快速解決。我知道但我只是建議。我會用'filter_input()' –

+1

更新是的,那是另一種選擇。就我個人而言,我不是那些過濾器的忠實粉絲,因爲他們多次讓我失望。他們沒事,但他們有他們的優點和「缺點」;-) –