带有sql值的php echo()中的javascript [关闭]

Posted

技术标签:

【中文标题】带有sql值的php echo()中的javascript [关闭]【英文标题】:javascripts in php echo() with sql values [closed] 【发布时间】:2020-03-25 19:24:07 【问题描述】:

我正在构建一个 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 */;

这是我想要实现的图像。 MAIN PAGE IMAGE 感谢您的帮助,谢谢!

【问题讨论】:

和 循环内的标签?每个网页应该只有一个 ID 必须是唯一的。 document.getElementById("mySelect") 将始终返回第一个,而不是当前循环迭代中的那个。 你也可以使用事件监听器而不是在 php 中放置 javascript 【参考方案1】:

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

connection.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);

ma​​in.php

<?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>

process.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!";
    

?>

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

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

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

我建议不要做的另一件事是在 SQL 语句中使用纯 $_GET[''] 变量,即使您必须通过链接说 $_GET[''] 值,而不是将其存储在变量 $clientid = $_GET['clientID']; 中而不是使用把$_GET['']直接放到SQL语句中,不出意外的话,看起来更好,更干净,更容易写。

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

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

【讨论】:

感谢您的代码和详细解释,我非常高兴今天学到了新东西。谢谢队友 :) 你太棒了【参考方案2】:

对您的问题的简短回答是肯定的,整个代码完全错误,所以这里有几点需要注意...

    首先,了解有关 html 的基本知识,它是如何工作的以及它的作用是什么 标签表示,然后,无论何时编写 html 代码,请确保 打开文档开头的&lt;html&gt;标签并关闭它 在结尾&lt;/html&gt;,同样的事情适用于 &lt;body&gt;...&lt;/body&gt;标签...打开前不能使用标签 文件,我的意思是你可以,但你不应该,这是正确的 这样做的方法

    <html>
        <body>
        <!--Your code here-->
        </body>
    </html>
    
    学会正确使用单引号和双引号。如果你 仔细观察你会发现你的陈述是 在使用引号时完全一团糟,我猜你是 玩弄引号,直到你让这件事按原样工作 现在工作,所以尝试编写一些脚本,目的是 学习使用引号(节省你的努力并做笔记,你 可能想要或需要在以后的生活中传递知识)领导 我们到第三点...

    尝试养成编写干净代码的习惯,无论是什么语言 你在写,写得尽可能干净,你不会总是完美的,但每一行你都会变得更好

    echo "<div class='form1'>
        Buyer: 13<br />
        Name: Lucas<br />
        Route: 123<br />
        Visited: lot of places
    
        <form id='form'>
            Select your favorite fruit:
            <select id='mySelect'>
                <option value='apple'>Apple</option>
                <option value='orange'>Orange</option>
                <option value='pineapple'>Pineapple</option>
                <option value='banana'>Banana</option>
            </select>
            <input type='submit'>
        </form>
        <p id='demo'></p>
        </div><br />";
    

    在您的问题中提供有关堆栈溢出的代码时,请尝试提供尽可能多的相关详细信息,以尽可能获得最佳答案。花点时间看看你的代码......你还没有发布从数据库中检索数据的部分,你还没有将 JS 与 PHP/HTML 分开,你甚至还没有关闭你的 &lt;/script&gt; 标签.更重要的是,当问一个问题时,尽量清楚,我真的很难理解你的问题是什么,即使有人要回答你的问题,他们也需要将一半的​​答案建立在假设之上您的代码或重写大部分代码以用于测试目的。 通过发布低质量问题,您获得任何答案的机会很小,并且当您投入更多时间来创建质量更高的问题时,您会详细了解问题并提供相关信息,人们更有可能对提供帮助感兴趣你解决你的问题。 但是,为了获得有关问题的足够相关信息,您需要尝试了解您所面临的问题,然后在网上搜索可能的解决方案,并在收集到有关您的问题的足够信息后,寻求帮助,包括每个您在此过程中收集的相关详细信息

    关于您的问题,我建议您不要在 PHP 中使用 JavaScript,因为还有其他方法可以实现所需的结果,因为在您的情况下它是一个事件侦听器,看看这个

    document.getElementById('form').addEventListener('submit', function(event)
        event.preventDefault();
        var x = document.getElementById('mySelect').value;
        document.getElementById('demo').innerHTML = x;
    );
    

    最后,由于我没有你的主要问题的答案,这里有一个更好的方法来提出这个问题,并可能得到答案或替代解决方案(请随意将其复制到新帖子,将其修改为相应地满足您的需求)

嘿,开发人员,我正在构建一个 Web 应用程序/编写一个脚本/ 练习我的编码知识,我遇到了一个障碍 一直给我添麻烦了。

我编写的代码应该从 下拉列表到放置在每个循环末尾的空段落 返回,我对这段代码的期望是每当我点击提交时 按钮,用于从我提交打印的表格中选择的水果 在属于同一循环结果的段落上。不过,我是 没有得到预期的结果,所以我一定做错了什么 请看一下我的代码并告诉我我能做些什么来实现 想要的结果。

PHP/HTML

$result = mysqli_query($mysqli, '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'>
        Select your favorite fruit:
        <select id='mySelect'>
            <option value='apple'>Apple</option>
            <option value='orange'>Orange</option>
            <option value='pineapple'>Pineapple</option>
            <option value='banana'>Banana</option>
        </select>
        <input type='submit'>
    </form>
    <p id='demo'></p>
    </div><br>";

JavaScript

document.getElementById('form').addEventListener('submit', function(event)
    event.preventDefault();
    var x = document.getElementById('mySelect').value;
    document.getElementById('demo').innerHTML = x;
);

这里有一些额外的图片,说明了我想要实现的目标以及它的实际效果(您的图片在这里)...

感谢您的帮助,谢谢!

所以,你看,不要害怕玩文字,因为你不仅在这里学习代码,而且还在练习你的沟通技巧和丰富你的词汇量,并且你投入更多的时间来写一个高质量的问题,为您的问题找到解决方案的机会更大,不要急于问一个快速的问题,这样您就可以得到一个快速的答案,而是专注于您面临的问题并解决它,直到您找到解决方案或至少您对自己实际面临的问题有一些了解,这样您就可以寻求帮助。

我希望这能帮助你开始更好地表达自己并在未来提出更好的问题,祝你平安!

【讨论】:

非常感谢你,我是一名网站设计师,基本上使用模板 css 的东西。我对像这样的硬编码 java php 知之甚少。我用谷歌搜索了很多答案,甚至到了这一点,很抱歉这个问题不准确。 朋友,请再次检查问题,我已经按照您的说法编辑了问题,感谢分享这些伟大的技巧和知识。 我确实检查了问题并且能够理解您的要求,因此我为您提供了解决方案,欢迎您

以上是关于带有sql值的php echo()中的javascript [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

带有文本值的 SQL Server 数据透视表

PHP用数组中的字符串替换字符

使用带有逗号值的 WHERE 的 SQL [重复]

PHP 防止 SQL 注入

带有 foreach 和 fetch 的 PHP PDO

php sql中带有日期、变量类别和总和值的数据透视表