mysqli 和 php 代码无法将字段正确插入数据库

Posted

技术标签:

【中文标题】mysqli 和 php 代码无法将字段正确插入数据库【英文标题】:mysqli and php code failing to insert field into database correctly 【发布时间】:2018-07-13 11:18:31 【问题描述】:

我有以下 php 代码试图

a) 要求用户输入学校密码 b) 查找数据库表“教师”,然后将新值(输入到文本框中)覆盖在数据库中学校密码的旧值上。

目前的问题是它确实使用新输入的 pin 在表中添加了一个新行,但我希望它覆盖该特定教师的现有值(基本上覆盖现有值)。

php处理程序代码如下:

if (isset($_POST["addpin1"]) && !empty($_POST['schoolpin1']) && $_SESSION['teacher']) 
    $school_pin         = mysqli_real_escape_string($con,$_POST['schoolpin1']);
    $email              = $_SESSION['email'];
    $username           = $_SESSION['username'];
    $pass               = $_SESSION['pass'];
    $check_duplicate = mysqli_query($con,"SELECT school_pin FROM teachers WHERE school_pin='$school_pin' ");
    if(@mysqli_num_rows($check_duplicate) == 0)
        $query = mysqli_query($con,"INSERT INTO teachers (school_pin,email,username,pass) 
            VALUES('$school_pin','$email','$username','$pass')");
        if($query)
            header("Location: teachers.php");   
        
    

HTML 表单代码:

 <form action="" method="post">
    <input type="text" name="schoolpin1" id="schoolpin1">
    <input type="submit" class="btn btn-success" name="addpin1" value="CHANGE PIN">

 </form>

数据库结构(tbl:教师)字段如下所示

id  
email  
school_pin  
username  
pass

发生这种情况的页面有一位教师登录,因此他们的用户名显示在屏幕上。

更新:根据有关开始会话的答案之一。这已经完成了

<?php
require_once("scripts/connect_db.php");

session_start();
if(!isset($_SESSION['teacher'])) header('Location: teacher_login.php');;
$result="";
if (isset($_POST["logout"])) 


    session_destroy();
   header('Location:index.php');


$err = "";

【问题讨论】:

我只看到INSERT 声明。无论如何,您都会添加新行。如果要覆盖现有行,则需要 UPDATE 语句。 @WillardSolutions 您能否在我的代码上下文中发布您建议的解决方案? 然后使用 UPDATE 或 INSERT ON DUPLICATE 我曾尝试 UPDATE 并导致新的错误,例如:注意:未定义索引:第 19 行 C:\xampp\.php 中的电子邮件。基本上,它随后停止识别声明的会话。 另外,这个脚本容易受到 MySQL 注入的影响,您应该使用准备好的语句并确保正在使用的每个字段都经过适当的验证和清理。 【参考方案1】:

如果您完全使用会话变量,则需要先启动会话。只需在脚本开头添加session_start()

【讨论】:

没有。我已经有了(这是给定的,因为代码并不总是产生会话变量错误)。我将更新代码和问题,以包括它在那里并且工作正常的事实 是的,我认为您会拥有它,但是我阅读了您上面关于使用会话变量的评论。然后我在写完评论后重新阅读了它...我想我起初误解了它。 【参考方案2】:

不太清楚你在问什么 - 你的主键是什么?

您说 “查找数据库表 'teachers',然后将新值(输入到文本框中)覆盖在数据库中学校密码的旧值上” 所以我猜你想要更新当前教师的学校密码值?主要的逻辑问题是:

当您检查重复项时,您正在寻找 新的 引脚,如果找不到则进行插入

你永远不会更新!

第一点:你有

$check_duplicate = mysqli_query($con,"SELECT school_pin FROM teachers WHERE school_pin='$school_pin' ");

我想你想要

SELECT school_pin FROM teachers WHERE username=` not `SELECT school_pin FROM teachers WHERE school_pin=

第二个,您需要在您的 if 上设置一个 else 块来进行更新。或者(例如,如果username 是主键)您可以使用insert ... on duplciate key update 并让mysql 处理该行是否存在的检查。见https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

请查看如何进行参数化查询并使用它们来代替您在此处使用的字符串。以How can I prevent SQL injection in PHP?开头

【讨论】:

我的假设是 school_pin 没有在数据库中被查找,但它是从 SESSION 声明中生成的......这就是它正在检查的内容。所以:检查当前的 school_pin(我假设使用会话),然后一旦找到,用新的 pin 覆盖它。回覆。 sql注入,这不是和保护有关吗:$school_pin = mysqli_real_escape_string($con,$_POST['schoolpin1']); 您在选择$check_duplicate 时使用相同的变量$school_pin,并在插入时作为新值。正如我和其他人所说,您需要一个 else 来进行更新,但是您要更新什么:您是要查找老师并更新与该老师关联的学校密码,还是查找学校密码并更新老师与引脚相关联?您需要清楚什么是键(您搜索和查找使用的唯一值)以及您正在更新的数据是什么。目前还不清楚。 是的,mysqli_real_escape_string 与保护有关。但是,您仍在使用会话变量而不检查它们。 Web 开发的第一条规则是永远不要信任任何用户提供的数据。最佳实践是使用参数化查询,而不是直接使用mysqli_real_escape_string 等。检查我链接的问题的答案。 谢谢。我希望找到老师或找到页面上已经显示的学校密码(对于已登录的老师),然后将该学校密码更改为表格中输入的任何内容。问题是它目前是 a) 没有找到正确的记录/字段和 b) 写入新行而不是更新该行中的一个字段。示例:TeacherA 登录并拥有学校密码:1234。(教师的用户名和学校密码都在页面上)。 TeacherA 输入 3432 并想将 TeacherA 记录的 pin 1234 更改为 3432。@Adam @MissComputing:“找到老师或找到页面上已经显示的schoolpin ...然后将该school pin更改为表格中输入的任何内容”我认为你需要决定哪个!正如我所说,您目前正在检查 new 引脚,但我认为您需要稍微考虑一下数据模型。你的钥匙是什么?哪些字段应该是唯一的?【参考方案3】:

这是您需要的结构。如果存在当前记录,请使用新信息对其进行更新。否则插入。根据您要更新的内容进行相应调整。也作为进一步的一点。请不要将用户输入直接放入数据库。对查询使用 binding parameters 的准备好的语句。

 if(@mysqli_num_rows($check_duplicate) == 0)
    $query = mysqli_query($con,"INSERT INTO teachers (school_pin,email,username,pass) 
                VALUES('$school_pin','$email','$username','$pass')");
    if($query)
        header("Location: teachers.php");
    
else

    $query = mysqli_query($con,"
          UPDATE teachers 
           SET email = '$email'  ,username = 
             '$username',pass = '$pass'
          WHERE school_pin='$school_pin'
     ");
    if($query)
        header("Location: teachers.php");
    


【讨论】:

为什么 if($query) header etc 在末尾重复? 能不能给个绑定参数的例子

以上是关于mysqli 和 php 代码无法将字段正确插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

带有 LIKE 数组的 PHP 和 MYSQLI:无法正确回显所有内容

MySQLi插入问题 - PHP 7.2.10

mysqli事务在insert失败时无法回滚

Mysqli - 日期的正确参数[重复]

使用 Mysqli 进行 PHP 登录

mysqli插入错误语法不正确