Php 当我通过输入文本传递值时,为什么这段代码不起作用?

Php 当我通过输入文本传递值时,为什么这段代码不起作用?,php,Php,当我通过输入文本传递值时,我不知道为什么这段代码不起作用?如果我违反了规则,那么它的正确格式是什么 <?php $id1 = $_POST["id1"]; $name = $_POST["name"]; $update = $_POST["update"]; echo $id1; //working echo $name; //working

当我通过输入文本传递值时,我不知道为什么这段代码不起作用?如果我违反了规则,那么它的正确格式是什么

<?php        

$id1 = $_POST["id1"];  
           $name = $_POST["name"];   
           $update = $_POST["update"];   
             echo $id1;    //working
             echo $name;    //working
             echo $update;    //working



  mysqli_query($conn , 'update insert1 set  '.$name.' = '.$update.'
    where id-1 = '.$id1.'' ); //not working
        // but if I manually use this as follows it works correctly
         mysqli_query($conn , 'update insert1 set  name = "new" where id-1 = '1'' );

  ?>

您似乎没有在SQL语句中声明变量

添加美元符号($)来声明

$id1 = $_POST["id1"];  
               $name = $_POST["name"];   
               $update = $_POST["update"];   
                 echo $id1;    //working
                 echo $name;    //working
                 echo $update;    //working



      mysqli_query($conn , 'update insert1 set  '.$name.' = '.$update.'
        where id-1 = '.$id1.'' ); //not working
            //but  if i manually use this as folwing it works correctly    mysqli_query($conn , 'update insert1 set  name = "new" where id-1 =
        '1'' );

  ?>

此外,您的代码已为打开

我会用单引号将
$update
包装起来(注意我翻转了引号),并将
id1
更改为
$id1

mysqli_query($conn , "update insert1 set  ".$name." = '".$update."'
where id-1 = ".$id1 );
如果
id-1
是数据库中的字符串列类型,那么我会用单引号将
$id1
括起来。像这样:

mysqli_query($conn , "update insert1 set  ".$name." = '".$update."'
where id-1 = '".$id1."'" );
注意事项:

  • 我会再次检查
    id-1
    是否在
    WHERE
    条件下使用,因为它会检查该列中的值是否为2而不是1
    其中id-1=1
    相当于
    其中id=2
    ,但读者更容易混淆(感谢FirstOne指出这一点)
  • 正如在另一个答案中提到的,您的代码易受SQL注入攻击,我要检查一下:

    • 首先,请正确缩进代码

      然后学习(或至少尝试理解)字符串串联是如何工作的。在PHP中,可以对字符串使用单引号或双引号

      我每次对我的同事重复的是,尝试(如果可能的话)将字符串包装成正确类型的引号,说明字符串可以(可能)包含什么

      如果您有机会在字符串中(或在连接到的某个变量中)有一个单引号,请将其包装为双引号

      如果您有机会在字符串中(或在连接到的某个变量中)使用双引号,请将其包装为单引号

      这似乎是显而易见的,但如果您在每次操作字符串时都记住这一点,那么您就可以很好地连接字符串和变量了

      另外,将完整原始查询作为参数传递的方式也不太可读。 输入一个单独的变量,然后像这样尝试:

      <?php        
      $id1 = $_POST["id1"];  
      $name = $_POST["name"];   
      $update = $_POST["update"];   
      
      $query = '
          UPDATE insert1
          SET ' . $name . ' = "' . $update . '"
          WHERE id-1 = ' . $id1 . '
      ';
      
      mysqli_query($conn, $query);
      ?>
      
      
      
      您会注意到,
      $name
      没有用引号括起来,因为它是字段名而不是值

      同样,
      $id1
      不是用引号括起来的,因为它是整数值而不是字符串值。
      但是,如果出于某种原因,
      id-1
      字段或您的
      insert1
      表将数字存储为字符串,因此您希望用双引号将其括起来。

      您需要在SQLID中使用$id1。您缺少字符串值周围的引号,并且您对sql注入非常开放。我的意思是,它不会更新我想要更新的值更新。您正在使用的有趣缩进方案如果您为了编写问题而在代码中插入注释,请确保新代码将运行。最好在您的编辑器中执行此操作,然后再运行一次,以确保您向我们展示的是实际编译的内容。也许你可以解释为什么它对SQL注入开放?我经常看到人们把别人的观察加入到他们的答案中。。。没有真正理解它本身。
      其中id-1=something
      表示id减去1的值是否等于something。请看一个例子: