首页 > 解决方案 > 带有 sql 值的 php echo() 中的 javascripts

问题描述

我正在构建一个 Web 应用程序,但遇到了困扰我一段时间的障碍。

我编写的代码应该将下拉列表中选择的元素值“插入/更新”到相应的 $row['Visited']。在这一点上我很困惑,我尝试使用我从谷歌获得的一些 javascript 代码,但没有任何效果。我得到的只是更新到第一行的值,尽管我已经从第二行中选择了下拉表单。我附上了数据库的图像

但是,我没有得到预期的结果,所以我一定是做错了什么,所以请查看我的代码并告诉我我可以做些什么来达到预期的结果。

PHP/HTML

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "newtarget";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT *
        FROM fos_data
        WHERE Fos_Name='".$_GET["clientID"]."'
        AND Route='".$_GET["fos_route"]."'" ;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
  while($row = $result->fetch_assoc()) {
echo "<div class='form1'>
Buyer: ".$row['Buyer_Name']."<br />
Name: ".$row['Fos_Name']."<br />
Route: ".$row['Route']."<br />
Visited: ".$row['Visited']." 

<form id='form'>
    Have You Visited this Buyer Place?
    <select id='mySelect'>
        <option value='yes'>YES</option>
        <option value='no'>NO</option>
    </select>
    <input type='submit'>
</form>
</div><br>";
}
}
else
{
    echo "0 results";
}
$conn->close();
?>

SQL

-- phpMyAdmin SQL Dump
-- version 4.9.2
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- Generation Time: Mar 26, 2020 at 07:41 AM
-- Server version: 10.4.10-MariaDB
-- PHP Version: 5.6.40

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `newtarget`
--

-- --------------------------------------------------------

--
-- Table structure for table `fos_data`
--

DROP TABLE IF EXISTS `fos_data`;
CREATE TABLE IF NOT EXISTS `fos_data` (
  `Buyer_Name` varchar(100) DEFAULT NULL,
  `Fos_Name` varchar(100) DEFAULT NULL,
  `Fos_Pass` double DEFAULT NULL,
  `Fos_Phone` double DEFAULT NULL,
  `Route` double DEFAULT NULL,
  `Visited` varchar(100) DEFAULT NULL,
  `Report` varchar(1000) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `fos_data`
--

INSERT INTO `fos_data` (`Buyer_Name`, `Fos_Name`, `Fos_Pass`, `Fos_Phone`, `Route`, `Visited`, `Report`) VALUES
('Buyer 1', 'Fos 1', 1, 1111, 1, '', ''),
('Buyer 2', 'Fos 1', 1, 1111, 1, '', ''),
('Buyer 3', 'Fos 1', 1, 1111, 1, '', ''),
('Buyer 4', 'Fos 1', 1, 1111, 2, '', ''),
('Buyer 5', 'Fos 1', 1, 1111, 2, '', ''),
('Buyer 6', 'Fos 1', 1, 1111, 2, '', ''),
('Buyer 7', 'Fos 1', 1, 1111, 3, '', ''),
('Buyer 8', 'Fos 1', 1, 1111, 3, '', ''),
('Buyer 9', 'Fos 1', 1, 1111, 3, '', ''),
('Buyer 10', 'Fos 1', 1, 1111, 3, '', ''),
('Buyer 11', 'Fos 2', 2, 2222, 1, '', ''),
('Buyer 12', 'Fos 2', 2, 2222, 1, '', ''),
('Buyer 13', 'Fos 2', 2, 2222, 1, '', ''),
('Buyer 14', 'Fos 2', 2, 2222, 2, '', ''),
('Buyer 15', 'Fos 2', 2, 2222, 2, '', ''),
('Buyer 16', 'Fos 2', 2, 2222, 2, '', ''),
('Buyer 17', 'Fos 2', 2, 2222, 2, '', ''),
('Buyer 18', 'Fos 2', 2, 2222, 3, '', ''),
('Buyer 19', 'Fos 2', 2, 2222, 3, '', ''),
('Buyer 20', 'Fos 2', 2, 2222, 3, '', '');
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

这是我想要实现的图像。 主页图片 感谢您的帮助,谢谢!

标签: javascriptphpsqlarrays

解决方案


好的,这是一种在服务器端执行此操作的方法

连接.php

$server = 'localhost';
$username = 'root';
$password = '';
$database = 'test';
$conn = new mysqli ($server,$username,$password,$database);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

主文件

<?php
    include 'connection.php';
?>
<html>
    <body>
    <?php
        $result = mysqli_query($conn, 'SELECT * FROM info');
        while($row = $result->fetch_assoc()) {
        echo "<div class='form1'>
            Buyer: ".$row['Buyer_Name']."<br />
            Name: ".$row["Fos_Name"]."<br />
            Route: ".$row["Route"]."<br />
            Visited: ".$row["Visited"]."

            <form id='form' method='POST' action='process.php'>
                Select your favorite fruit:
                <select id='mySelect' name='selection'>
                    <option value='yes'>YES</option>
                    <option value='no'>NO</option>
                </select>
                <input type='hidden' name='buyer_id' value=".$row['Buyer_Id'].">
                <input type='submit' name='update'>
            </form>
            <p id='demo'></p>
            </div><br>";
        }
    ?>
    <body>
</html>

进程.php

<?php
include 'connection.php';

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

    $buyer_id = mysqli_real_escape_string($conn, $_POST['buyer_id']);
    $selection = mysqli_real_escape_string($conn, $_POST['selection']);

    $sql = "SELECT * FROM info WHERE Buyer_Id='$buyer_id'";
    $result = mysqli_query($conn, $sql);
    $rows = mysqli_num_rows($result);

    if(mysqli_num_rows($result) > 0){
        $update = "UPDATE info SET Visited='$selection' WHERE Buyer_Id='$buyer_id'";
        $run = mysqli_query($conn, $update);
        header('Location: main.php');
    }
    else{
        echo "There was an error!";
    }
}
?>

因此,正如您所看到的,您需要告诉代码在提交表单时要做什么,以及如何通过定义表单操作^来执行此操作,其目的是将浏览器重定向到您告诉文档的新文档它,如果此表单确实已提交(因为有人可能会手动登陆同一个文档process.php),那么如果表单确实已提交,则执行所需的操作,在您的情况下,更新所选行的已访问列。

现在,让代码知道您要更新哪一行的方法之一是使用隐藏输入,其值与行 ID 一样唯一。

mysqli_real_escape_string在传递值并将它们分配给变量作为安全措施和 SQL 注入的防御机制时使用,因为客户端可以操作的所有内容都不能被信任并且需要通过过滤器,以确保客户端不会尝试传递一些 SQL 语句,因此也将其付诸实践。

我建议不要做的另一件事是$_GET['']在 SQL 语句中使用纯变量,即使你必须$_GET['']通过链接说值,而不是将其存储在变量中而$clientid = $_GET['clientID'];不是$_GET['']直接使用 SQL 语句,如果没有别的,它看起来更好,更干净,更容易写。

但是,此方法是在服务器端完成的,需要您刷新页面才能让浏览器显示更新的信息(请注意页面在提交时刷新),此代码实际所做的是将浏览器发送到另一个文档process.php并然后在成功更新数据库后,它会将您返回到主页,这就是为什么您可以立即看到更改的原因,但无论如何它都会刷新,当您尝试将消息返回为“用户已更新”main.php时,这可能会有点烦人或“出现错误”,如果您想在不刷新页面的情况下实现此目的,您需要了解 ajax,这是一种在客户端计算机上处​​理服务器端请求而不刷新文档的方法。

^ 表单的属性操作不一定必须将浏览器重定向到新文档,它也可以告诉它在刷新时执行写入同一文档的代码,这可以通过将值留空action=''或使用井号来实现action='#'


推荐阅读