【问题标题】:Form action not posting, via php/html表单动作未发布,通过 php/html
【发布时间】:2014-08-02 14:35:38
【问题描述】:

我在将一些信息从表单发布到删除功能时遇到问题,我可能会为此而自责,但我找不到答案。

  • admin/index.php
  • lib/admin_functions.php
  • lib/delete_user.php

如上,我有 3 个文件。

它自己的功能如下:

// Display users
function get_all_users() {
    global $con;
    $sql = "SELECT * FROM users ORDER BY id ASC";
    $result = mysqli_query($con, $sql);
    echo "<tr><td>   </td><td> User ID </td><td> Username </td><td> Email Address </td><td> Zendesk User Id </td><td>
    Zendesk View ID </td><td> Firstname </td><td> Surname </td><td> Nickname </td><td> Active 
    </td><td> Admin </td><td> Display Stats?</td><td> Remove User </td></tr>";
    while($row = mysqli_fetch_array($result)) {
        // Displaying all user details
        echo "<tr><td><img height='40' width='40' src='{$row['user_photo']}'></td><td>" .$row['id']. "</td><td>" .$row['user_name']. "</td><td>" .$row['email_address']. "</td><td>" .$row['zendesk_user_id']."</td><td>"
         .$row['zendesk_view_id']. "</td><td>" .$row['user_firstname']. "</td><td>" .$row['user_surname']. "</td><td>" .$row['user_nickname'].  "</td><td>"
         .$row['is_active']. "</td><td>" .$row['is_admin']. "</td><td>" .$row['display_stats'].
         // Form for deleting a user
         "</td><td><form id='delete_user' accept-charset='UTF-8' action='/delete_user.php' role='form' method='POST'><input type='checkbox' value='Delete'><input type='hidden' name='user_id' value='{$row['id']}'></td></tr>";
    }
    echo "<tr><td> Delete Selected User(s) </td><td>";
    echo "<input type='submit' name='submit' value='Delete My Account' onClick=\"return confirm('Are you sure you want to delete this account?')\"></td></form></tr>";
}

上述函数属于admin_functions.php,它显示我所有的用户,带有一个额外的列,带有一个删除复选框,底部是一个带有删除按钮的表单。

然后我有 delete_user 代码

<?php
session_start();
if( ! $_SESSION['loggedIn'] && ! $_SESSION['isAdmin']) {
    // If not admin or logged in, die
    die();
}
require_once(dirname(__FILE__).'/admin_functions.php');
require_once(dirname(__FILE__).'/../config.php');

// DELETE USER 

$user_id = mysql_real_escape_string( $_POST['user_id'] );

// Insert the customer, including the password hash
$sql = "DELETE FROM users where id = '{$user_id}' limit 1";
if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}

print "User Deleted";
mysqli_close($con);

?>

最后在索引文件上,我有一些调用函数的东西。

<?php get_all_users(); ?>

我遇到的问题是代码都按预期显示,但是在警告消息之后没有任何反应。似乎没有任何内容发布到 delete_user.php,我在 apache2 中没有看到任何错误,在我的控制台中也没有。

有什么想法吗?

【问题讨论】:

  • 这个mysql_real_escape_string 应该是mysqli_real_escape_string,但更具体地说是$user_id = mysqli_real_escape_string($con, $_POST['user_id']); - 这两种不同的API 不能混合使用。
  • 啊,是的,一定错过了。谢谢你,先生。不确定这会解决它,我们会看到:)
  • 您说的是警告信息。哪一个?
  • 看起来您正在删除任何用户,甚至没有检查复选框是否被选中。
  • 我这里有个提示:" 提示有效,之后没有任何反应。

标签: javascript php forms session post


【解决方案1】:

根据我们的聊天对话,我提交以下答案以结束问题并标记为已解决。

您需要对 HTML/表格进行一些细微的修改。另外,您需要稍后对其进行修改以成为更安全的方法。

我没有时间添加额外的东西。

您也没有任何&lt;table&gt;&lt;/table&gt; 标签。

使用以下链接 >>> mysqli_ with prepared statementsPDOprepared statements 将有助于 SQL 注入。

<?php 

$DB_HOST = "xxx"; // replace
$DB_NAME = "xxx"; // replace
$DB_USER = "xxx"; // replace
$DB_PASS = "xxx"; // replace

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($con->connect_errno > 0) {
  die('Connection failed [' . $con->connect_error . ']');
}

$sql = "SELECT * FROM users ORDER BY id ASC";
$result = mysqli_query($con, $sql);


echo "<!DOCTYPE html>" . "\n";
echo "<head></head>" . "\n";
echo "<body>" . "\n";

echo "<form id='delete_user' accept-charset='UTF-8' action='' role='form' method='POST'>" . "\n";

echo "<table>" . "\n";
echo "<tr><td> User ID </td><td> Username </td><td> Email Address </td><td> Zendesk User Id </td><td>
Zendesk View ID </td><td> Firstname </td><td> Surname </td><td> Nickname </td><td> Active 
</td><td> Admin </td><td> Display Stats?</td><td> Remove User </td></tr>" . "\n";

while($row = mysqli_fetch_array($result)) {
    // Displaying all user details
    echo "<tr><td>USER PHOTO CODE</td><td>" .$row['id']. "</td><td>" .$row['user_name']. "</td><td>" .$row['email_address']. "</td><td>" .


     "</td>\n<td><input type='checkbox' name='user_id[]' value='{$row['id']}'></td></tr>" . "\n";
echo "<tr><td> Delete Selected User(s) </td><td>" . "\n";

}

echo "<input type='submit' name='submit' value='Delete My Account' onClick=\"return confirm('Are you sure you want to delete this account?')\"></td>\n</tr>" . "\n";

echo "</table>" . "\n";

echo "</form>";

echo "</body></html>" . "\n";

if(isset($_POST['submit'])){

foreach($_POST['user_id'] as $id){
    $id = (int)$id;
    $delete = "DELETE FROM users WHERE id = $id"; 
    mysqli_query($con,$delete);
}

print "User Deleted";
mysqli_close($con);

}

【讨论】:

  • 谢谢,事实上我从来没有在 php 中调用 它是在外面的 html 中,这让我感到困惑。我将 html 移出并转义到 PHP 中,它现在可以工作了!谢谢
【解决方案2】:

你没有做一个有效的 HTML:

这就是你所拥有的:

<tr>
    <td>
        <form>
    </td>
</tr>
<tr>
    <td></td>
    <td></td>
        </form>
</tr>

这是你应该拥有的:

<tr>
    <td>
        <form>
            <table><tr><td><!-- checkbox --></td><td><!-- submit --></td></tr></table>
        </form>
    </td>
</tr>

编辑:嗯...我会尝试用有效的 HTML 表单重写你的函数:

function get_all_users() {
    global $con;
    $sql = "SELECT * FROM users ORDER BY id ASC";
    $result = mysqli_query($con, $sql);
    echo "<tr><td> </td><td> User ID </td><td> Username </td><td> Email Address </td><td> Zendesk User Id </td><td> Zendesk View ID </td><td> Firstname </td><td> Surname </td><td> Nickname </td><td> Active </td><td> Admin </td><td> Display Stats?</td><td> Remove User </td></tr>";
    while($row = mysqli_fetch_array($result)) {
        // Displaying all user details
        echo "<tr><td><img height='40' width='40' src='" .$row['user_photo']. "'></td><td>" .$row['id']. "</td><td>" .$row['user_name']. "</td><td>" .$row['email_address']. "</td><td>" .$row['zendesk_user_id']."</td><td>" .$row['zendesk_view_id']. "</td><td>" .$row['user_firstname']. "</td><td>" .$row['user_surname']. "</td><td>" .$row['user_nickname'].  "</td><td>" .$row['is_active']. "</td><td>" .$row['is_admin']. "</td><td>" .$row['display_stats']. "</td>
         <td>
         <form id='delete_user' accept-charset='UTF-8' action='/delete_user.php' role='form' method='POST'>
         <table>
         <tr>
         <td><input type='checkbox' value='Delete'><input type='hidden' name='user_id' value='". $row['id']. "'></td>
         </tr>
         <tr>
         <td> Delete Selected User(s) </td>
         <td><input type='submit' name='submit' value='Delete My Account' onClick=\"return confirm('Are you sure you want to delete this account?')\"></td>
         </tr>
         </table>
         </form>
         </td>
         </tr>";
    }
}

【讨论】:

  • 我已经改变了这一点,并没有什么不同。 :(
  • 已编辑...您应该尝试编写适当的代码以查看是否有问题。
  • 嗯,有道理,我只想要 1 个删除按钮,这就是我采用这种方法的原因。谢谢:)
  • 这确实有效,但我更喜欢一个删除框,所以我会看看下面的答案。
  • 原因可能是因为你在循环中有表单标签。让他们脱离循环。 @Runt
【解决方案3】:

在 while 循环内创建表单,而结束标记和提交按钮在循环外。 因此,创建了多个表单和一个提交按钮。 理想情况下应该是这样的

打开表格

在循环时,创建复选框 循环结束

提交按钮

关闭表格。

【讨论】:

    【解决方案4】:

    首先,您在表单中使用checkboxes,因此应将隐藏变量user_id 声明为array

    <input type='hidden' name='user_id[]' value='{$row['id']}'>
    

    然后在你的php文件delete_user.php中使用如下代码删除用户

                //echo "<pre>";print_r($_POST);exit; //check user ids using print_r() function
                $user_id = $_POST['user_id'];
                foreach($user_id as $userid) {
                    // Insert the customer, including the password hash
                    $sql = "DELETE FROM users where id = '$userid' limit 1";
                    if (!mysqli_query($con,$sql)) {
                      die('Error: ' . mysqli_error($con));
                    }
                }
    

    【讨论】:

    • pastebin.com/Y2vyiv3E - 删除表格 pastebin.com/NQTECGdf - 功能还是一样的结果。
    • 您不需要在 forecah 循环之外删除查询。取消注释 print_r() 函数以检查帖子中的用户 ID。它应该工作
    • 已删除:P,它不再进入表单。
    • 您没有在 delete_user.php 文件中获得 id 吗?
    • 没有进入表单,点击提交,然后确认。什么都没有发生。
    【解决方案5】:

    您正在混合使用这两个 api。它必须是 mysqli_real_escape_string 而不是 mysql_real_escape_string

    【讨论】:

    • 哼哼在我看来一模一样
    • 我敢打赌我没有抄袭你..这是我能看到的常见错误..:)
    • 不,这不是我的意思...我的意思是 mysqli_real_escape_string 对我来说与 mysqli_real_escape_string 完全相同,所以我不明白你的答案
    • OP 已经修复了它,所以这不是真正的原因。请删除或编辑以解决实际问题。加上 " 而不是 mysqli_real_escape_string." - 应该读作 " 而不是 mysql_real_escape_string。"
    • @Fred-ii- 已修复 .. 这是我的错误,对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2011-03-17
    相关资源
    最近更新 更多