【问题标题】:Same value entered in the database even on sending different values即使发送不同的值,在数据库中输入的值也相同
【发布时间】:2017-06-21 08:01:08
【问题描述】:

我在 php 上制作一个表单,将数据保存到数据库中 这是我将数据从 php 表单发送到数据库的代码:

<?php
$users_name = $_POST['name'];
$users_email = $_POST['email'];
$users_phoneNumber = $_POST['phNo'];
$users_cnic = $_POST['cnic'];
$users_voucherNumber = $_POST['vNum'];
$users_modelNumber = $_POST['prod'];


if( $_POST )
        {

          $dbhost = "localhost";
          $dbuser = "root";
          $dbpassword = "";
          $dbname = "dany";
          $query = "";
          $sqlQuery = ""; 


          $conn = new mysqli($dbhost, $dbuser, $dbpassword, $dbname);

          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          } 


          echo ("Variables values: " . " "  . $users_cnic . " " . 
                          $users_phoneNumber . "<br>");
          $query = "INSERT INTO customer( c_name, c_phoneNumber, c_cnic, 
                    c_email, c_voucherNumber, c_modelNumber) VALUES 
                     ('$users_name','$users_phoneNumber', '$users_cnic', 
                    '$users_email', $users_voucherNumber, 
                       '$users_modelNumber')";

          if ($conn->query($query) === TRUE) {
              //if successful
            echo ("Variables values after success: " . " "  . $users_cnic . 
                   " " . $users_phoneNumber . "<br>");
          } else {
              //if data not successfully entered
              echo "Error: " . $query . "<br>" . $conn->error;
          }

          $conn->close();

        }

?>

但问题是当我尝试发送数据时,“c_phoneNumber”和“c_cnic”每次发送相同的值,即“2147483647”。即表中的每一行都有两列,每一列都有值“2147483647”。

如果您看到我已经准备好检查值是否正确的行:

echo ("Variables values: " . " "  . $users_cnic . " " . $users_phoneNumber . 
      "<br>");

在这里,它们的值与从表单的文本框发送的值完全相同。但是当在下一行代码中进行查询时:

$query = "INSERT INTO customer( c_name, c_phoneNumber, c_cnic, 
                    c_email, c_voucherNumber, c_modelNumber) VALUES 
                     ('$users_name','$users_phoneNumber', '$users_cnic', 
                    '$users_email', $users_voucherNumber, 
                       '$users_modelNumber')";

这两个变量都包含“2147483647”。

当成功将数据输入表后运行if语句时:

if ($conn->query($query) === TRUE) {
              //if successful
            echo ("Variables values after success: " . " "  . $users_cnic . 
                   " " . $users_phoneNumber . "<br>");
          }

它具有从文本框中传递的相同值。 我无法弄清楚变量数据在整个程序运行状态中保持不变但插入数据库时​​发生变化的问题。

我试过了:

1- 创建一个新表

2- 创建两个新列

3- 发送硬编码值。

 $query = "INSERT INTO customer( c_name, c_phoneNumber, c_cnic, 
                    c_email, c_voucherNumber, c_modelNumber) VALUES 
                     ('$users_name',123, 456, 
                    '$users_email', $users_voucherNumber, 
                       '$users_modelNumber')";

当我执行第 4 步时,完美发送和插入的值为 123、456。

4- 创建一个新查询,将其保存在另一个变量中,运行查询 = 相同的结果。(错误)

【问题讨论】:

  • 了解prepared Statement以防止SQL注入
  • Jens 是对的,你的代码很容易被黑客入侵。恶意用户可能会输入可能窃取、删除或损坏您的数据的数据。使用准备好的语句和参数来保护您的数据库。在网上很容易找到这方面的教程。
  • 您说它在两个字段中都插入了“2147483647”。 '$users_phoneNumber', '$users_cnic' 表示您正在插入字符串(由于引号围绕变量)。但是您的硬编码示例插入了整数。数据库中每个字段的数据类型是什么?插入时每个文本框的值是多少?可能是字符串/整数不匹配。如果您按照应有的方式使用了参数,那么这种数据类型不匹配就会消失。
  • @Jens 我已经尝试按照您的提示进行操作。它适用于 2 到 3 个条目,但随后又开始出现同样的问题
  • @ADyson,这两个字段中的每一个都是数据库中的整数。我试过删除引号,它确实输入整数,但只输入“2147483647”。当我进行插入时,每次的值都是不同的整数。我不重复输入。文本框输入类型在 html 代码中声明为“数字”。它不允许除数字之外的任何字符串/按键。

标签: php html mysql sql mysqli


【解决方案1】:

2147483647 是 MySQL 中 INT 字段的最大(有符号)值。任何大于该值的数字都将重置为该最大值。见https://dev.mysql.com/doc/refman/5.7/en/integer-types.html。如果需要存储更大的数字,可以使用 BIGINT 类型。

【讨论】:

    【解决方案2】:

    试试这个兄弟希望对你有帮助

    <?php
    $users_name = $_POST['name'];
    $users_email = $_POST['email'];
    $users_phoneNumber = $_POST['phNo'];
    $users_cnic = $_POST['cnic'];
    $users_voucherNumber = $_POST['vNum'];
    $users_modelNumber = $_POST['prod'];
    
    if(!empty($_POST['name']))
    {
              $dbHost = "localhost";
              $dbUsername = "nextgbsl_pay";
              $dbPassword = "Welive@2017";
              $dbName = "nextgbsl_tbl_payment";
    
    
    
              $db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);
               //Display error if failed to connect
           if ($db->connect_errno) {
               printf("Connect failed: %s\n", $db->connect_error);
                 exit();
                       } 
    
    echo ("Variables values: " . " "  . $users_cnic . " " . 
                              $users_phoneNumber . "<br>");
                $query =  $db->query("INSERT INTO customer( c_name, c_phoneNumber, c_cnic, 
                        c_email, c_voucherNumber, c_modelNumber) VALUES 
                         ('".$users_name."','".$users_phoneNumber."', '".$users_cnic."', 
                        '".$users_email."', '".$users_voucherNumber."', 
                           '".$users_modelNumber."')";);
    
    
              if ($conn->query($query) === TRUE) {
                  //if successful
                echo ("Variables values after success: " . " "  . $users_cnic . 
                       " " . $users_phoneNumber . "<br>");
              } else {
                  //if data not successfully entered
                  echo "Error: " . $query . "<br>" . $conn->error;
              }
    
              mysqli_close($con);
    
    
    }
    
    ?>
    

    【讨论】:

    • 很多代码,但没有解释为什么会有所帮助。这对 OP 或未来的读者来说用处不大,他们只会复制/粘贴而不学习,所以不是一个很好的答案。它也错过了关于正在使用的整数大小的关键点,并且无法修复 SQL 注入漏洞,甚至无法将插入的值作为整数而不是字符串传递。据我所知,这只是使用稍微不同的 PHP 语法将字符串连接在一起,这根本没有增加任何价值。
    • 非常感谢兄弟。问题是我在数据库中使用的数据类型。 “2147483647”是整数数据类型的最大值,我将其更改为 BIGINT,它解决了 pronlem。感谢您调查此事
    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2018-10-12
    • 2011-03-24
    • 2017-04-02
    • 1970-01-01
    • 2023-01-19
    • 2018-12-13
    • 2017-06-15
    相关资源
    最近更新 更多