0

在我的程序中,我试图获取表单提交的值并在 sql 查询中使用以检索结果,然后再次使用 $_GET["name"] 值将数据提供给数据库。以下代码未在 while 循环 $_GET["name"] 内传播值

    <?php
    session_start();
    $id = $_GET["name"];
    echo "<h2> Hello ".$id." </h2>" ;
    if((isset( $_POST['dept'])))

    {

    echo "<h2><center>You have sected  &nbsp;&nbsp;&nbsp;&nbsp;". $_POST['dept'] ." !!</center></h2>";


        $dept_ = $_POST['dept'];
          $options = $_POST['course'];
                 foreach($options as $option) //loop through the checkboxes
                 {

                    $uid="root";
                    $pass="root";

                    $db = mysql_connect("localhost:3036",$uid,$pass);
                if(!$db) die("Error connecting to MySQL database.");
                mysql_select_db("sync" ,$db);


        $result = mysql_query("SELECT DISTINCT `name`,`password`,INET_NTOA( `ip` ) FROM detail Where id = '$_GET["name"]' ;") or die(mysql_error());

        if(mysql_num_rows($result) > 0):

            while($row = mysql_fetch_assoc($result)): 
                    $name = $row['name']; 
                    $password = $row['password']; 
                $ip = $row['INET_NTOA( `ip` )'];
                echo $name ;            // NOT PRINTING ANYTHING
                echo $password ;       // NOT PRINTING ANYTHING
                echo $_GET["name"] ;  // NOT PRINTING ANYTHING


                $sql1_Qu = "INSERT INTO registration (id,password,ip,name,course) VALUES ('$_GET["name"]','$password',INET_ATON('$ip'),'$name','$option')";
                //$sql1_Qu = "INSERT INTO registration (id,password,ip,name,course) VALUES ('$id','$password',INET_ATON('$ip'),'$name','$option')";
                $resu = mysql_query($sql1_Qu) or die('Could not connect: ' . mysql_error());
            endwhile;
        endif;

         }
    }
?>

这仅在第 4 行打印,但不传播包含数据库查询的 while 循环内的值。

请提出一些解决问题的方法......在此先感谢

4

4 回答 4

2

我认为您在为您的$_GET["name"]. 我也不清楚您是否有$_GETor$_POST表格,因为您同时使用了它们,这可能是一个错误。

$result = mysql_query("SELECT DISTINCT `name`,`password`,INET_NTOA( `ip` ) FROM detail Where id = '".$id."' ;") or die(mysql_error());

此外,您的代码非常容易受到 sql 注入的影响,请查看此帖子

然后我希望您记住这些mysql_*功能已被弃用,因此我建议您切换到mysqliPDO

于 2013-05-25T17:55:52.347 回答
1

This line:

$result = mysql_query("SELECT DISTINCT `name`,`password`,INET_NTOA( `ip` ) FROM detail Where id = '$_GET["name"]' ;") or die(mysql_error());

Has wrong escaping and is vulnerable to injection. Fix the escaping and use safe functions at the same time:

$result = mysql_query(
            sprintf("
              SELECT
                DISTINCT `name`,
                `password`,
                INET_NTOA( `ip` )
              FROM
                detail
              WHERE
                id = '%s'
             ", mysql_real_escape_string($id))
             ) or die(mysql_error());
于 2013-05-25T18:01:10.363 回答
0

改变:

    FROM detail Where id = '$_GET["name"]' ;")

    FROM detail Where id = '" . $id .  "';")
于 2013-05-25T17:54:50.373 回答
0

您应该对此感到高兴,因为您的网站正在为人们所说的 SQL 注入而尖叫。http://en.wikipedia.org/wiki/SQL_injection

基本上,您网站的用户可以添加?name=<some sql code>到您的网址并操作您的数据库(即更改密码)。始终验证输入!切勿在 sql 查询中使用 $_GET 或 $_POST。

在此处阅读更多信息以了解如何防止 SQL 注入: http: //php.net/manual/en/security.database.sql-injection.php

至于你的回答。您错误地连接了您的字符串(或实际上..根本没有)。

尝试以这种方式构建您的字符串: "INSERT INTO registration (id,password,ip,name,course) VALUES ('" . $_GET["name"] . "','$password',INET_ATON('$ip'),'$name','$option')"

于 2013-05-25T17:57:56.513 回答