【问题标题】:PHP can't retrieve value from HTML formPHP 无法从 HTML 表单中检索值
【发布时间】:2020-07-24 00:05:40
【问题描述】:

我似乎无法从表单中检索 PHP POST 值。输入值正在从 Ajax 中检索并插入到下面的输入表单中。但是,表单提交测试无法从输入中检索值。我可以知道问题是什么以及如何解决吗?提前致谢。

UpdateProfile.php

<?php
session_start();
include("dbcon.php"); 

if(isset($_POST['updateProfile']))  
{  
    $profileCode=$_POST['profileCode'];
    $profileName=$_POST['profileName'];
    $profileDesc=$_POST['profileDesc'];
    echo "<script>alert('".$profileCode."')</script>";

    $find_user="select * from profile where profileCode='$profileCode'"; 
    $statement = $dbcon->prepare($find_user);
    $statement->execute();
    if($row = $statement->fetch())
    {  
        echo "<script>alert('".$profileCode."')</script>";
    } 
    else 
    {
        echo "<script>alert('Failed to update profile!')</script>";
    }
} 
?>

<script>
function editBtn(profileCode) {
                $.ajax({
                    type:"POST", 
                    url: "test.php", 
                    dataType: "html",
                    data: {profileCode:profileCode},
                    success: function(data){
                        $('#profileCode').val(data.split(",")[0]);
                        $('#profileName').val(data.split(",")[1]);
                        $('#profileDesc').val(data.split(",")[2]);
                        event.preventDefault();
                    }
                });}
</script>

<?php
 $username = $_SESSION["username"];
 $query = "SELECT * FROM profile WHERE username='$username'";
 $statement = $dbcon->prepare($query);
 $statement->execute();
 $result = $statement->fetchAll();
 foreach($result as $row)
 {
?>
<i class="ti-pencil" onclick="editBtn('<?php echo $row['profileCode']; ?>')"></i>
<?php } ?>
<form role="form" method="post" action="manageprofile.php">
       <label>Profile Code</label>
       <input type="text" class="form-control border-input" id="profileCode" name="profileCode" value="" disabled>
       <label>Profile Name</label>
       <input type="text" class="form-control border-input" id="profileName" name="profileName" value="" placeholder="Profile Name" required>
       <label>Profile Description</label>
       <textarea rows="5" class="form-control border-input" placeholder="About you" id="profileDesc" name="profileDesc" value=""></textarea>
</form>

test.php

<?php
include("dbcon.php"); 

$courseCode = $_POST['profileCode'];
$query = " SELECT * FROM profile WHERE profileCode='$profileCode' ";
$statement = $dbcon->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
foreach($result as $row)
{
    echo $row['profileCode'].",".$row['profileName'].",".$row['profileDesc'];
} ?>

Image: Post return no value in alert

错误代码:第 7 行 ($profileCode=$_POST['profileCode'];) //点击提交后

【问题讨论】:

  • 你的 PHP 错误日志是怎么说的?
  • 能否请您提供一下现在输出的截图。
  • 您需要向我们展示 test.php 页面,这是 AJAX 发送已发布数据的位置,和/或 manageprofile.php 页面,该页面是表单发送已发布数据的位置......
  • data: {profileCode:profileCode}profileCode 设置在哪里?
  • 您的 SQL 面临 SQL 注入攻击的风险,需要紧急进行改进。你需要use prepared statements with your variables in the SQL

标签: php ajax


【解决方案1】:

简单的答案是您在 html 中禁用了输入 profileCode

<input type="text" class="form-control border-input" 
id="profileCode" name="profileCode" value="" disabled> <!-- disabled -->

这就是 $_POST 不检索 profileCode 的原因。

此外,您只是在 ajax-request 中发送 profileCode 的值:

data: {profileCode:profileCode}` 

所以你正在发送一个带有 profileCode 数据的 ajax-request(post-request)。 profileCode 本身被发送到 PHP。但是因为 PHP 不包含 PHP 中禁用的元素,所以该值将为空。

因此其他字段也将为空 - 因为您在 test.php 中的代码:

$statement->fetchAll(); 

根本不会产生任何输出,因此不会返回任何 html 响应(因为针对 db 的查询中的 profileCode 是空的 (SELECT * FROM profile WHERE profileCode=''))


其他人已经评论过:您必须改进处理 SQL 注入的方式。您正在使用准备好的语句,但您使用它们的方式根本没有保护.

我相信您正在使用 PDO 驱动程序:

代替:

 $query = "SELECT * FROM profile WHERE username='$username'";
 $statement = $dbcon->prepare($query);

您应该使用:

$query = "SELECT * FROM profile WHERE username=:username";
$statement = $dbcon->prepare($query);
$statement->execute( array(':username', $username) );

这使得用户不可能弄乱实际的字符串(SELECT * FROM profile WHERE username=:username),因为:username 只是一个占位符。

【讨论】:

  • 我已经尝试过提醒其他未禁用的字段,但输出仍然是空白。
  • 您还将 dataType 定义为 html,但您将响应数据视为一个数组(使用 split())。您能否在 ajax 的成功部分中发出警报?
  • 是的。这只是一些测试,将很快转换为 json
  • 但是 data.split(",")[0] (或 [1] 或 [2] 也可能为空,因为您尝试将 html 拆分为数组(您的 html 可能里面没有逗号)
  • 好的。我已更改为 $statement->execute(array(':username' => $username) );它有效。 :) 谢谢
【解决方案2】:

谢谢你帮助我。我想到了一个解决方案,再次使用 ajax 来检索这些更新的值并将其发送到 test.php。

UpdateProfile.php

function submitEditProfileForm(){
            $.ajax({
                type:"POST", 
                url: "test.php",
                data: {
                    profileCode:$('#profileCode').val(),
                    profileName:$('#profileName').val(),
                    profileDesc:$('#profileDesc').val()
                },
                success: function(data){
                    alert(data);
                }
            });
        }

test.php

if(isset($_POST['profileCode']) && isset($_POST['profileName']) && isset($_POST['profileDesc'])){
    $profileCode= $_POST['profileCode'];
    $profileName= $_POST['profileName'];
    $profileDesc= $_POST['profileDesc'];
    echo $profileCode.",".$profileName.",".$profileDesc;

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2021-08-31
    • 2021-08-31
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多