2016-02-05 59 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

更新是的,那是另一种选择。就我个人而言,我不是那些过滤器的忠实粉丝,因为他们多次让我失望。他们没事,但他们有他们的优点和“缺点”;-) –