【问题标题】:PHP update() MySQL database not workingPHP update() MySQL 数据库不工作
【发布时间】:2018-07-05 02:07:20
【问题描述】:

我正在做一个测验,最后要求用户提供人口统计信息,但我在用我收集的信息正确填充表格时遇到了一些问题。

以下代码是我的 databaseAdapator.php 文件的一部分。第一个是 initUser(),在我的数据库中设置一个用户条目并将所有内容初始化为 0 - 这正在发生/我可以在 MySQL 中看到这些值。

udpateUser() 是我遇到问题的地方。调用它的页面 (addUser.php) 具有该函数所需的所有信息,但是当我调用它时,数据库中没有任何变化。

本质上,我想执行以下命令:

update users set age=11, gender="Male", height_cm=2 where user_id=95;

我的代码

public function initUser($age, $gender, $height, $weight, $ip){
    //create new dummy user
    $stmt = $this->DB->prepare("Insert into users values(null, :age, :gender, :height, :weight, :ip)");
    $stmt->bindParam('age', $age);
    $stmt->bindParam('gender', $gender);
    $stmt->bindParam('height', $height);
    $stmt->bindParam('weight', $weight);
    $stmt->bindParam('ip', $ip);
    $stmt->execute();

    //select last insert ID
    $stmt = $this->DB->prepare("SELECT LAST_INSERT_ID() from users");
    $stmt->execute();
    $userId = $stmt->fetch();
    return $userId[0];
}


public function updateUser($user, $age, $gender, $height, $weight){
    //edit the information for a user after demographics page
    $stmt = $this->DB->prepare("UPDATE users SET age=:age, gender=:gender, height_cm=:height, weight_kg=:weight WHERE user_id=:user");
    $stmt->bindParam('age', $age);
    $stmt->bindParam('gender', $gender);
    $stmt->bindParam('height', $height);
    $stmt->bindParam('weight', $weight);
    $stmt->bindParam('user', $user);
    $stmt->execute();

    return $user;
}

这里是调用函​​数的页面addUser.php。我知道这是一种可怕的做法(对不起!),我正在尝试让数据库适配器暂时正常工作,并且我已经手动检查了所有变量 - 它们都是有效且非空的。

<?php
require_once("./databaseAdaptor.php");
$user = $_GET["user"];

$age = $_POST["Age"];
$gender = $_POST["Gender"];
$height_in = $_POST['in'];
$height_ft = $_POST['ft'];
$height = 2.54 * (($height_ft * 12) + $height_in);
$weight = $_POST['lbs'];


$userId = $myDatabaseFunctions->updateUser($user, $age, $gender, $height, $weight);
?>

编辑: 这是我调用 initUser.php 的地方

<?php
require_once("./databaseAdaptor.php");

$userId = $myDatabaseFunctions->initUser(0, null, 0, 0,  0);
?>

<form name='fr' action='quiz.php' method='POST'>
        <input type='hidden' name='user' value='<?=$userId?>'>
        <input type="submit" />
</form>


<script type='text/javascript'>
document.fr.submit();
</script>

这里是人口统计.php,其中包括为 addUser.php 收集信息的表单。进入 quiz.php 的第一个表单向用户询问一系列问题,当他们到达末尾时,它会将它们发送到这里。查看数据库,他们的答案被记录下来,初始化似乎“正确”发生。我唯一没有做的事情是在测验的末尾更新用户信息。

<?php
require_once("./databaseAdaptor.php");

$page = '0';

if( isset($_GET["user"])) {
        $user = $_GET["user"];
} else {
        echo "error";
$page = '1';
}
?>

<!DOCTYPE HTML5>
<html lang="en">

<body bgcolor="#0000">
<font color="white">

    <meta charset="UTF-8">
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <title>FOOD CALORIES</title>
    <link rel="stylesheet" href="css/style.css"/>

<body>

    <div>
        <h4><a href="index.html">Calorie4Food</a></h4>
    </div>
    <br></br>
    <br></br>
        <center>



                        <form  method="post" action="./addUser.php?user=<?php echo $user?>" onsubmit="checkform()">
<h6>
                        <!-- Age Button -->
                <fieldset id="Age" >
                        Please Select Age: <br>
                        <input type="radio" value="10" name="Age" > 10<br>
                        <input type="radio" value="20" name="Age"> 11 - 20<br>
                        <input type="radio" value="30" name="Age"> 21 - 30<br>
                        <input type="radio" value="40" name="Age"> 31 - 40<br>
                        <input type="radio" value="50" name="Age"> 41 - 50<br>
                        <input type="radio" value="60" name="Age"> 51 - 60<br>
                        <input type="radio" value="60" name="Age">  > 60<br>
                </fieldset>

                        <!-- Gender Button -->
                        <fieldset id="Gender" >
                                Please Select Gender: <br>
                        <input type="radio" value="Male" name="Gender" > Male <br>
                        <input type="radio" value="Female" name="Gender"> Female <br>
                        <input type="radio" value="Other" name="Gender"> Other <br>
                        </fieldset>

                        <fieldset id="HeightWeight">
                                Please provide your height and weight so that we may calculate your bmi: <br></br>                              
                                <div id="calculator">
                                
                                <!-- Button for Metric/Standard conversion -->
                                <input id="toUS" type="button" class="btnsml" value="US" onclick="metrictous();" style="display:none;">
                                <input id="tometric" type="button" class="btnsml" value="metric" onclick="ustometric();" style="display:inline;">

                                <p id="height"></p>
                                <div id="usheight" style="display:inline;">
                                    <c>Height:</c>
                                <input type="text" name="ft" id="ft" size="1" maxlength="1" onkeyup="updateBMI();" value="0">
                                    <c>ft</c> <br></br>
                                <input type="text" name="in" id="in" size="2" maxlength="2" onkeyup="updateBMI();" value="0">
                                    <c>in</c>
                                </div>
                                <div id="metricheight" style="display:none;">
                                    <c>Height:</c>
                                <input type="text" name="cm" id="cm" size="3" maxlength="3" onkeyup="updateBMI();" value="0">
                                    <c>cm</c>
                                    </div>
                                <br></br>
                                <p id="weight"></p>
                                <div id="usweight" style="display:inline;">
                                    <label for="lbs"><c>Weight:</c></label>
                                <input type="text" name="lbs" id="lbs" size="3" maxlength="3" onkeyup="updateBMI();" value="0">
                                    <c>lbs</c>
                                          </div>

                                <div id="metricweight" style="display:none;">
                                    <label for="kg"><c>Weight:</c></label>
                                <input type="text" name="kg" id="kg" size="3" maxlength="3" onkeyup="updateBMI();" value="0">
                                    <c>kg</c>
                                    </div>
                                    <br></br>
                                <p></p>
                                    </div>
                                    </div>
                                <br></br> Thank you! 

                        </fieldset>

                        <br></br>
                        
                        <input type="hidden" value="<?=$user?>" name="user"/>
                        <input type="submit" value="Submit" name="submit"/>

                        </form>

</h6>

</body>
</html>

所以一般流程是:initUser.php(调用databaseAdaptor)、quiz.php、statistical.php、addUser.php(调用databaseAdaptor)。数据库中直到 addUser.php 的所有信息似乎都是正确的。

【问题讨论】:

  • 尝试检查PDO errors
  • 你能告诉我们你调用initUser()的代码吗?
  • 好的,我会把它扔进主帖
  • 有些事情正在发生......发现你的错误可能有助于阐明那是什么。

标签: php mysql sql database web


【解决方案1】:

您在调用updateUser() 的页面上错误地获取了您的$userId

你称它为:

$user = $_GET["user"];

但是您的表单使用的是$_POST,这意味着$user 被设置为NULL。这意味着在执行脚本期间不会发生任何事情,因为查询确实 成功执行,只是没有将user_idNULL 相同的列。所以你应该通过以下方式调用它:

$user = $_POST["user"];

这将使它等于通过您的表单提交的任何内容。


疑难解答

您似乎仍有一些问题。以下是一些建议:

以不同的方式使用 PDO。尝试通过execute() 传递所有变量并包含&lt;pre&gt; 标签以帮助您找出问题所在。我还加了一个die(),这样当它点击这个函数时就会杀死页面,这样你就可以真正得到&lt;pre&gt;的显示了,这个应该在排错后去掉。

public function updateUser($user, $age, $gender, $height, $weight){
    $stmt = $this->DB->prepare("UPDATE users SET age=?, gender=?, height_cm=?, weight_kg=? WHERE user_id=?");

    $variables = [$age, $gender, $height, $weight, $user];
    echo "<pre>".print_r($variables, true)."</pre>";

    $stmt->execute($variables);
    return $user;
}

【讨论】:

  • 我遇到的部分问题是由于重定向到人口统计页面,用户没有从测验页面正确发布,所以它被移到了 URL 中的一个参数。
  • @JFinder updateUser() 函数实际返回什么?你能附和告诉我吗?
  • @JFinder 另外,您能告诉我您实际上是如何访问addUser.php 的吗?在我看到的表格中,它转到quiz.php
  • 不幸的是,updateUser() 根本没有返回,这就是我卡住的地方。其余信息已添加到原始帖子中。
  • @JFinder 表示$user未设置,表示$_GET['user']无效。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2015-07-25
  • 2017-08-10
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多