【问题标题】:Update db table with an INT使用 INT 更新 db 表
【发布时间】:2017-02-14 12:30:10
【问题描述】:

好吧,我想不通。

我希望登录的用户使用金额 (INT) 更新行,我不断收到无效参数错误以及对非对象上的成员函数 execute() 的调用。

这是应该更新数据库的 php 和 html

<?php
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
session_start();
require_once 'class.user.php';
$user_home = new USER();

if(!$user_home->is_logged_in())
{
    $user_home->redirect('index.php');
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_client_info WHERE UCODE=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

    if($stmt->rowCount() == 1)
    {
        if(isset($_POST['btn-update-data']))
        {
            $purchasedata = $_POST['purchasedata']; 
            $cpurchasedata = $_POST['cpurchasedata'];


            if($cpurchasedata!==$purchasedata)
            {
                $msg = "<div class='alert alert-block'>
                        <button class='close' data-dismiss='alert'>&times;</button>
                        <strong>Sorry!</strong>  Input Does Not Match. Make sure the details match. 
                        </div>";
            }
            else
            {

                $stmt = $user_home->register("INSERT INTO tbl_client_info (purchasedata) VALUES (?)");
                $stmt->execute(array(":purchasedata"=>$purchasedata));

                //

                $msg = "<div class='alert alert-success'>
                        <button class='close' data-dismiss='alert'>&times;</button>
                        Okay, we have added data to your account.
                        </div>";
            }
        }   
    }
    else
    {
        $msg = "<div class='alert alert-success'>
                <button class='close' data-dismiss='alert'>&times;</button>
                No Sorry That Did Not Work, Try again
                </div>";

    }

?>

<!DOCTYPE html>
<html>
  <head>
    <title>Forgot Password</title>
    <!-- Bootstrap -->
    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
    <link href="bootstrap/css/bootstrap.css" rel="stylesheet" media="screen">
    <link href="bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet" media="screen">
    <link href="assets/styles.css" rel="stylesheet" media="screen">

    <link href="css/bootstrap.min.css" rel="stylesheet">

    <link href="fonts/css/font-awesome.min.css" rel="stylesheet">
    <link href="css/animate.min.css" rel="stylesheet">
     <!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <!-- Custom styling plus plugins -->
    <link href="css/custom.css" rel="stylesheet">
  <link href="css/icheck/flat/green.css" rel="stylesheet">
<script src="js/vendor/modernizr-2.6.2-respond-1.1.0.min.js"></script>

<!-- Sweet Alert -->
  <script src="dist/sweetalert-dev.js"></script>
  <link rel="stylesheet" href="dist/sweetalert.css">
  <!--.......................-->

  </head>



<body style="background:#f3f3f3;"> 

    <div id="wrapper">
      <div id="login_content" class="animate form">
        <section class="login_content">
          <form method="post">
            <h1>Purchase Data</h1>

            <div class='alert alert-success'>
            <strong>Hello </strong><?php echo $row['firstname'] ?>! //add more text here
        </div>

        <?php
        if(isset($msg))
        {
            echo $msg;
        }
        ?>
        <input type="text" class="input-block-level" placeholder="500mb" name="purchasedata" required />
        <input type="text" class="input-block-level" placeholder="Retype the bundle" name="cpurchasedata" required />
        <hr />
        <button class="btn btn-large btn-primary" type="submit" name="btn-update-data">Add data to my account</button>
            <div class="clearfix"></div>
            <div class="separator">

这里是 class_user.php

<?php

require_once 'dbconfig.php';

class USER
{   

    private $conn;

    public function __construct()
    {
        $database = new Database();
        $db = $database->dbConnection();
        $this->conn = $db;
    }

    public function runQuery($sql)
    {
        $stmt = $this->conn->prepare($sql);
        return $stmt;
    }

    public function lasdID()
    {
        $stmt = $this->conn->lastInsertId();
        return $stmt;
    }

    public function register($uname,$email,$upass,$code,$purchasedata)
    {
        try
        {                           
            $password = md5($upass);
            $stmt = $this->conn->prepare("INSERT INTO tbl_client_info(User_Name,billingemail,password,purchasedata,tokenCode) 
                                                         VALUES(:User_Name, :billingemail, :password, :purchasedata, :active_code)");
            $stmt->bindparam(":user_name",$uname);
            $stmt->bindparam(":user_mail",$email);
            $stmt->bindparam(":user_pass",$password);
            $stmt->bindparam(":active_code",$code);
            $stmt->bindparam(":purchasedata",$purchasedata);
            $stmt->execute();   
            return $stmt;
        }
        catch(PDOException $ex)
        {
            echo $ex->getMessage();
        }
    }

    public function login($email,$upass)
    {
        try
        {
            $stmt = $this->conn->prepare("SELECT * FROM tbl_client_info WHERE billingemail=:email_id");
            $stmt->execute(array(":email_id"=>$email));
            $userRow=$stmt->fetch(PDO::FETCH_ASSOC);

            if($stmt->rowCount() == 1)
            {
                if($userRow['userStatus']=="Y")
                {
                    if($userRow['password']==md5($upass))
                    {
                        $_SESSION['userSession'] = $userRow['UCODE'];
                        return true;
                    }
                    else
                    {
                        header("Location: index.php?error");
                        exit;
                    }
                }
                else
                {
                    header("Location: index.php?inactive");
                    exit;
                }   
            }
            else
            {
                header("Location: index.php?error");
                exit;
            }       
        }
    catch(PDOException $ex)
    {
        echo $ex->getMessage();
    }
}

任何帮助将不胜感激

【问题讨论】:

  • $user_home-&gt;register() 的调用不应将SQL 查询作为参数。
  • 您的命名占位符是另一个问题
  • 您犯了与上一个问题stackoverflow.com/q/42219923/1415724 相同的错误,并且不知道为什么您接受了那里的答案,因为他们没有完全解决它。
  • 为什么要使用 md5?你不会和这个一起生活吗?
  • 将 password_hash 与盐一起使用。 md5 很容易破解

标签: php mysql prepared-statement


【解决方案1】:

查看您命名的占位符:

(:User_Name, :billingemail, :password, :purchasedata, :active_code)

        $stmt->bindparam(":user_name",$uname);
        $stmt->bindparam(":user_mail",$email);
        $stmt->bindparam(":user_pass",$password);
        $stmt->bindparam(":active_code",$code);
        $stmt->bindparam(":purchasedata",$purchasedata);
  • 它们不匹配。

每个命名占位符必须匹配并且大写。

例子:

:user_name:User_Name 相同。

所以这里:

(:user_name, :user_mail, :user_pass, :purchasedata, :active_code)

手册对此相当明确:

在使用 MD5 时不要使用它,它不再安全。

使用password_hash():

检查错误:

并确保您的列名正确,字母大小写可能是一个因素。

【讨论】:

  • @sean 欢迎。还要检查错误,我在底部附近提供了一些链接,您可以查看和使用。
  • @sean 并确保查询中的列名正确。您可能在占位符中使用了错误的列名。命名占位符不需要与列名匹配(这是个人偏好),但列名必须正确,并且占位符的名称必须在 VALUES 和绑定中匹配。
  • @sean you write: "to update a row with a amount (INT)" - 如果你想“更新”一个表,你需要使用UPDATE而不是INSERT。如果是这样的话,那就另当别论了。如果您不知道 UPDATE 的工作原理,它与 INSERT 的语法不同,您需要阅读dev.mysql.com/doc/refman/5.7/en/update.html 的手册 - 确保您也开始了会话,因为您正在使用会话。
  • 我要做的就是将用户输入的值放在特定的行中。无论如何,这将再次设置为零。所以 INSERT INTO 是我应该使用的还是我看错了?
  • @sean 很难说。如果表中有现有数据并且您想更新某一行,那么您需要“更新”它,而不是“插入”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2019-05-14
  • 2020-01-09
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多