【问题标题】:allowing users to edit in the mysql允许用户在 mysql 中进行编辑
【发布时间】:2014-01-07 03:02:40
【问题描述】:

我的代码有问题。此代码应该显示一个 mysql 数据库并让用户对其进行编辑,以便他们的编辑在 mysql 表中注册。但由于某种原因,查询不起作用,我无法得到它,以便用户可以编辑到 mysql 表中。

<!DOCTYPE HTML>
<html>
<head>
    <title><?php echo 'giggity'; ?></title>
</head>
<body>
<?php
$con = mysqli_connect('localhost', 'root', 'ankith12','Employees');
        if (mysqli_connect_errno())
    {
         echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

        $sql = "select * from Employ";
        $query = mysqli_query($con,$sql);
        echo "<table border ='1' style='height:90%;width:90%; position: absolute; top: 50; bottom:50; left: 0; right: 0;border:1px solid' align = 'center'>
            <tr>
            <th>Employee id</th>
            <th>Firstname</th>
            <th>Lastname</th>
            <th>Meetings Today</th>
            <th>Sales</th>
            <th>Comments</th> 
            </tr>";
            ?>
            <form method = 'Post'>
            <?php
$i = 1;
 while( $row = mysqli_fetch_array($query) )
{
    echo "<tr><td>". $row['employee_id'] . "<br><input type ='submit' name = 'Submit_$i' >". "</td>";
    echo "<td>". $row['Firstname']. "<input type = 'textfield' name = 'first' >"."</td>";
    echo "<td>". $row['Lastname']."<input type = 'textfield' name = 'second' >" . "</td>";
    echo "<td>". $row['Meetings']."<input type = 'textfield' name = 'third' >". "</td>";
    echo "<td>". $row['Sales']."<input type = 'textfield' name = 'fourth' >". "</td>";
    echo "<td>". $row['Comments']."<input type = 'textfield' name = 'fifth' >". "</td></tr>";
    $i++;
}
echo "</table>";
?>
<br>
<br> 
<!-- Submit<br><input type ='submit' name = 'Submit' > -->
</form>
<?php 

function alert($s){
    echo "<script type = 'text/javascript'>alert(\"$s\");</script>";
}

// $i = 1
$con = mysqli_connect('localhost', 'root', 'ankith12','Employees');
        if (mysqli_connect_errno())
    {
         echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
$query = "SELECT employee_id from Employ";
$qudey = mysqli_query($con,$query);
$rows= mysqli_fetch_assoc($qudey);
$dee = 1;
$easy = 0;
// $userfirst = $_POST['first'];
// $userlast =  $_POST['second'];
// $usermeetings =  $_POST['third'];
// $usersales =  $_POST['fourth'];
// $usercomments =  $_POST['fifth'];
foreach($rows as $i){
    //alert($_POST["Submit_$dee"]);
    if(isset($_POST["Submit_$dee"])) {
    //  alert("true");
        $i = 1;
        $userfirst = $_POST['first'];
        $userlast =  $_POST['second'];
        $usermeetings =  $_POST['third'];
        $usersales =  $_POST['fourth'];
        $usercomments =  $_POST['fifth'];
        alert($userfirst);
        if($userfirst !== ""){
            $QueryA = "UPDATE Employ SET Firstname = $userfirst WHERE employee_id = $i";
            mysqli_query($con,$QueryA);
            alert($QueryA);
        }
        if($userlast !== "")
        {
            $QueryB = "UPDATE Employ SET Lastname = $userlast WHERE employee_id = $i";
            mysqli_query($con,$QueryB);
        }
        if($usermeetings !== "")
        {
            $QueryC = "UPDATE Employ SET Meetings = $usermeetings WHERE employee_id = $i";
            mysqli_query($con,$QueryC);
        }
        if($usersales !== "")
        {
            $QueryD = "UPDATE Employ SET Sales = $usersales WHERE employee_id = $i";
            mysqli_query($con,$QueryD);
        }
        if($usersales !== "")
        {
            $QueryE = "UPDATE Employ SET Comments = $usercomments WHERE employee_id = $i";
            mysqli_query($con,$QueryE);
        }
        //echo 'done';
}
//  echo'done';
    $easy++;
    $dee = $dee + 1;
}
mysqli_close($con);
?>
</body>
</html>

【问题讨论】:

  • 运行查询时是否出现错误?尝试通过mysqli_error()捕获它
  • 不,当我单击提交按钮时,它不会在 html 表中更新
  • 旁注:您的代码受到 SQL 注入攻击,因为您直接允许在查询中插入 POST 值。
  • 你的表名是什么? Employemployee?
  • 您在表名中使用了“E”而不是“e”。有数据显示吗?

标签: php html mysql edit


【解决方案1】:

@user3152011 您是否有超过 1 名员工,如果是这样,您的输入将全部返回空白,除非您尝试更新最后一名员工的信息,因为您定义了多个具有相同名称的输入。试试var_dump($_POST)看看。

例如,现在如果您有 2 名员工,那么您将有 2 个输入都具有相同的名称,例如 &lt;input type = 'textfield' name = 'first' &gt;,因此当您提交第一个员工时,您的 $_POST['first'] 将为空白。

您可以将 &lt;form&gt; 放在您的 while 循环中,以便每个都是单独的形式,或者考虑使用类似 &lt;input type = 'textfield' name = 'first[]' &gt; 的东西,以便它们都作为数组返回,这样您就有 $_POST['first'][0]$_POST['first'][1]等等。

另外,如果您希望用户编辑字段名称(而不是打印出值然后使用echo "&lt;td&gt;". $row['Firstname']. "&lt;input type = 'textfield' name = 'first' &gt;"."&lt;/td&gt; 输入空白输入)使用echo "&lt;td&gt;&lt;input type = 'textfield' name = 'first' value='". $row['Firstname']."'&gt;"."&lt;/td&gt; 将该值直接放入文本字​​段中,它会更友好.而且由于这些值将使用数据库中的值填充,您不必检查它是否为空白,如果已提交,您始终可以运行 UPDATE,如果没有任何更改,它只会使用现有数据更新它没有变化。

我不确定你为什么要第二次运行$query = "SELECT employee_id from Employ";

现在,您似乎正在硬编码以更新 WHERE employee_id = $i 在您的情况下为 1。您可能希望使用echo "&lt;input type="hidden" name="employee_id" value = '".$row['employee_id']."'&gt;"; 之类的方式将employee_id 与所有其他字段一起传递。这样,当您提交表单时,您将在$_POST['employee_id'] 中获得一个employee_id,然后只需更新该员工即可。

***别忘了使用http://ca1.php.net/mysqli_real_escape_string保护自己免受SQL注入

你可以试试下面的代码:

<!DOCTYPE HTML>
<html>
<head>
    <title><?php echo 'giggity'; ?></title>
</head>
<body>
<?php
function alert($s){
    echo "<script type = 'text/javascript'>alert(\"$s\");</script>";
}
    $con = mysqli_connect('localhost', 'root', 'ankith12','Employees');
        if (mysqli_connect_errno())
    {
         echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    //We'll try to update data first so that the query to display Employ is shown with fresh data
    if(isset($_POST["employee_id"])) {
        $useremployeeid = mysqli_real_escape_string($con,$_POST['employee_id']);
        $userfirst = mysqli_real_escape_string($con,$_POST['first']);
        $userlast =  mysqli_real_escape_string($con,$_POST['second']);
        $usermeetings =  mysqli_real_escape_string($con,$_POST['third']);
        $usersales =  mysqli_real_escape_string($con,$_POST['fourth']);
        $usercomments =  mysqli_real_escape_string($con,$_POST['fifth']);

        alert($userfirst);

        $QueryA = "UPDATE Employ SET Firstname = '$userfirst',
                                     Lastname = '$userlast',
                                     Meetings = '$usermeetings',
                                     Sales = '$usersales',
                                     Comments = '$usercomments'
                    WHERE employee_id = $useremployeeid";
        $query = mysqli_query($con,$QueryA);
        if (!$query){
             printf("Error: %s\n%s\n", mysqli_sqlstate($con),mysqli_error($con));
        }
    }

        $sql = "select * from Employ";
        $query = mysqli_query($con,$sql);
        if (!$query){
             printf("Error: %s\n%s\n", mysqli_sqlstate($con),mysqli_error($con));
        }
        echo "<table border ='1' style='height:90%;width:90%; position: absolute; top: 50; bottom:50; left: 0; right: 0;border:1px solid' align = 'center'>
            <tr>
            <th>Employee id</th>
            <th>Firstname</th>
            <th>Lastname</th>
            <th>Meetings Today</th>
            <th>Sales</th>
            <th>Comments</th> 
            </tr>";
$i = 1;
 while( $row = mysqli_fetch_array($query) )
{
    echo "<form method = 'Post'>";
    echo "<input type='hidden' name='employee_id' value='".$row['employee_id']."'>";
    echo "<tr><td>". $row['employee_id'] . "<br><input type ='submit' name = 'Submit_$i' >". "</td>";
    echo "<td><input type = 'textfield' name = 'first' value='". $row['Firstname']. "'>"."</td>";
    echo "<td><input type = 'textfield' name = 'second' value='". $row['Lastname']."'>" . "</td>";
    echo "<td><input type = 'textfield' name = 'third' value='". $row['Meetings']."'>". "</td>";
    echo "<td><input type = 'textfield' name = 'fourth' value='". $row['Sales']."'>". "</td>";
    echo "<td><input type = 'textfield' name = 'fifth' value='". $row['Comments']."'>". "</td></tr>";
    echo "</form>";
    $i++;
}
echo "</table>";
mysqli_close($con);
?>
</body>
</html>

【讨论】:

    【解决方案2】:

    你有这样的更新语句:

    UPDATE Employ SET Firstname = $userfirst WHERE employee_id = $i
    

    大多数人的名字都是一串字母。例如,假设员工 1 的名字是“Gordon”:

    UPDATE Employ SET Firstname = Gordon WHERE employee_id = 1
    

    你能看出这个查询有什么问题吗?提示:SQL 不会将“Gordon”识别为任何东西。您需要单引号来分隔值:

    UPDATE Employ SET Firstname = '$userfirst' WHERE employee_id = $i
    

    当您编写执行变量替换的代码并且遇到问题时,第一步应该总是打印出字符串after 变量替换。

    【讨论】:

      【解决方案3】:

      您好,您可以使用下面的代码,而不是对每个字段重复相同的查询

      $query=mysql_query("UPDATE Employ SET Firstname = '$userfirst',Lastname = '$userlast',Meetings = '$usermeetings',Sales = '$usersales',Comments = '$usercomments'WHERE employee_id ='$i'") or die(mysql_error)
      

      希望这对你有用

      【讨论】:

        【解决方案4】:

        如何帮助自己:

        您的代码中发生的事情太多,无法进行简单的测试,或者坦率地说,这里的任何人都花时间帮助您。

        复制上面的代码并暂时将其放在一边。然后砍掉你的代码,去掉所有绝对不需要的东西。将其缩减为大约 3 行代码。

        1) Just a connect and display any error message.  
        2) Create a simple query string with one field and one table.
        3) And then run that one line and get the error message back.
        

        顺便说一句,您可以使用 MySQL 查询浏览器编辑您的 MySQL 吗?如果不先解决这个问题。

        你必须学会​​把问题分成两半,并在它们不起作用时简化它们。你不能真的指望其他人为你做这项工作。作为一名程序员,你的工作是通过一次测试一些小东西来学习梳理细节。然后,当您让小东西发挥作用时,您可以将它们加在一起以构建大东西。我使用了 1000 行代码长的程序,并将它们减少到 10 行以有时找出问题(不经常,谢天谢地,但有时)。例如,多年前我有一个错误,内存中的一个随机字节被间歇性地改变。这是一个相当大的项目,起初我不知道在哪里寻找它。但是通过删除一些东西以简化系统的过程,我能够一点一点地弄清楚它的来源。原来是一个寄存器被一个定时器以随机的方式每秒踩一次。

        提示:我经常使用 Notepad++ 中的撤消/重做功能进行此剪切,因为一旦我发现我的问题,很容易将文本恢复到原来的样子。首先,我标记并复制修复。然后撤消。然后在最后粘贴修复。很容易将 1000 行切成 10 行,然后在完成后将其恢复为 1000。有时我前进或后退多达 30 或 100 次编辑。这比注释掉它们更容易删除它们,然后再撤消删除。

        【讨论】:

          猜你喜欢
          • 2021-07-29
          • 1970-01-01
          • 2016-01-18
          • 1970-01-01
          • 2017-09-24
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          • 2012-11-09
          相关资源
          最近更新 更多