【问题标题】:Updating DB data from PHP variables从 PHP 变量更新数据库数据
【发布时间】:2014-11-21 03:52:04
【问题描述】:

我对 SQL 语句中的变量有疑问。我有一个表格,用户可以在其中更新他的个人资料。表单重定向到action.php?action=settings

当我尝试不使用 $variables 时,没有问题!但问题是,我有很多这样的查询,但不是为了更新。

function change_user_data($trainer) {
    require("database.php");

    try {
        $results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");        
    } catch (Exception $e) {
        echo "Data could not be changed!";
        exit;
    }
}

这是我的action.php

if ($action == "settings")  {
    $email = $_POST['email'];
    $status = $_POST['status'];
    $password = $_POST['password'];

    change_user_data($trainer);
} 

当我echo 那些$variables 时,它们会显示出来,所以它们不是空的。但是这个查询更新了我的表但没有数据,所以之后一切都是空的。

【问题讨论】:

  • 我不是PHP专家,但来自this question,我认为连接查询中的数据有问题。但是,这似乎容易发生 SQL 注入,最好使用prepared statements

标签: php mysql variables pdo sql-update


【解决方案1】:

我认为问题在于变量范围。

在函数之外定义的变量不能在函数中使用,除了全局变量或其他东西。

你有两种方法。

首先。如果 change_user_data 函数在 action.php 文件中,则添加“global $email, $status, $password”,如下所示:

function change_user_data($trainer) {

    global $email, $status, $password;

    require("database.php");

    try {
        $results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");        
    } catch (Exception $e) {
        echo "Data could not be changed!";
        exit;
    }
}

或者第二个。将电子邮件、状态、密码数据传递给功能。然后就可以使用了。

请查看本手册:

http://php.net/manual/en/language.variables.scope.php

【讨论】:

  • 虽然您的诊断正确,但处方可能不正确。请不要建议将全局变量用于如此简单的事情,可以通过向函数添加参数来完成
  • 所以这对我有用,但我像 Touregsys 写的那样做到了:change_user_data($trainer, $email, $password, $status);我认为这是解决此类问题的最佳方式,或者您认为如何?你能告诉我为什么我应该使用全局
【解决方案2】:

你可以试试这个:

$results = $db->query("UPDATE trainer SET email='".$email."', status='".$status."', password='".$password."' WHERE name='".$trainer."'");        

【讨论】:

    【解决方案3】:
    change_user_data($trainer, $email, $password, $status);
    
    function change_user_data($trainer, $email, $password, $status) {
        require("database.php");
    
        try {
            $results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");        
        } catch (Exception $e) {
            echo "Data could not be changed!";
            exit;
        }
    }
    

    【讨论】:

      【解决方案4】:

      在您获得发布变量之后然后检查这些变量 那些是否为空 如果不为空或为 NULL,则使用具有非空变量的更新查询更新数据库

      【讨论】:

        【解决方案5】:

        可能

        • 列的数据类型错误。仔细检查您的表结构。示例:如果您将列 email 设置为 int,那么您不能将其行值插入或更新为文本或字母
        • 单引号内的变量不正确。尝试连接变量和查询字符串以获得更好的实践

        如果这些都不起作用

        尝试使mysql语法错误并检查这些变量的值,然后您可以定义错误。

        对不起我的英语不好

        【讨论】:

          【解决方案6】:

          这个函数你有几个问题:

          • 范围问题,您没有传递所有值
          • 您容易受到 sql 注入的攻击
          • 你不检查记录是否更新

          功能:

          function change_user_data($db, $params) {
              try {
                  $sql = "UPDATE trainer SET email= ?, status=?, password=? WHERE name=?";
                  $stmt = $db->prepare($sql);  
                  $stmt->execute($params);
                  $success = ($stmt->rowCount() > 0) ? true : false;
              } catch (Exception $e) {
                  echo "Data could not be changed!";
                  $success = false;
              }
          return $success;
          }
          

          用法

          require("database.php");
          
          $params = array($trainer, $email, $password, $status);
          $user_data_updated = change_user_data($db, $params);
          
          if($user_data_updated){
            echo 'user data updated';
          }else{
            echo 'user data did not update';
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-17
            • 2019-05-22
            • 2014-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多