gpt4 book ai didi

javascript - 从 MySQL DATABASE(即多个表)创建 JavaScript 对象

转载 作者:行者123 更新时间:2023-11-30 22:58:28 26 4
gpt4 key购买 nike

很抱歉要添加另一个 JavaScript 对象。我只是有点难以理解这个问题,因为它比我处理过的要复杂一些。

如标题所述,我正在尝试创建一个 JavaScript 对象或 MySQL 数据库的多维数组。出于测试目的,我只使用我的数据库中的三个表,尽管最终它将存储数十个表。这些表称为“接口(interface)”、“IPAM”和“DNSF”。

我想完成这个任务的原因是,我正在尝试创建一个繁重的 ajax 页面,它动态地知道何时添加、更新、删除等表,并自动反射(reflect)这一点,而无需添加更多代码。我通过 用 php 编写 javascript 以及吐出 html 和变量的各种其他 ajax 回调来做到这一点。

让我从硬编码的 HTML 开始。所有其他 html 都是动态创建的。这也将很快动态创建,以便在不添加代码的情况下向我的网站添加按钮。

<body>
<div class = "form">
<button type="button" class = "formbutton" value = "Interfaces" onclick="inputChoice('Interfaces')">Interfaces</button>
<button type="button" class = "formbutton" value = "IPAM" onclick="inputChoice('IPAM')">IPAM</button>
<button type="button" class = "formbutton" value = "DNSR" onclick="inputChoice('DNSR')">DNSR</button>
</div>
<div class = "tableDiv" id="myTableDiv" style="height:1000px;width:1000px;border:1px solid #ccc; overflow: scroll;"><table id = "myTable"></table></div>
</body>

在执行任何按钮或事件之前,我的页面所做的第一个事情是在 $( document ).ready(function() { 中发出 ajax 请求。功能。我的问题是我必须为每个表编写一个单独的 ajax 请求。我将在此处展示一个获取接口(interface)表数据的示例:

$.ajax({
url:"/ryan/nonEmber/ajax.php?table=Interfaces",
beforeSend: function(XMLHttpRequest){},
success: function(data, textStatus) {
InterfacesCols = data.split(" ");
InterfacesCols.pop();
$.getJSON("/ryan/nonEmber/getJson.php?table=Interfaces", function( data ){
var items = [];
$.each(data.post, function(key, val){
items.push(val);
});
for(i = 0; i < items.length; i++){
var myString = '<tr id = "visibleRow">';
for(j = 0; j < InterfacesCols.length; j++){
if(InterfacesCols[j] != null){
myString = myString + '<td id = "visibleDef">' + items[i][InterfacesCols[j]] +'</td>';
}
}
myString = myString + '</tr>';
Interfaces.push(myString);
}
});
}
});

这个 ajax 请求最终创建了一个用于创建表格的 html 字符串数组。 Interfaces[] 包含每个 html 行。 InterfacesCols 包含每一列的名称。我必须为每个表编写这段代码。

我想做的是将我的“Interfaces[]”(如数组)和“InterfacesCols[]”(如数组)放在一个主数组中,这样我就可以创建一个模板,而不需要大量相同的代码。

让我们称这个主数组为。这将允许我将我的 ajax 放在 for 循环中并循环遍历每个表数组而不是对其进行硬编码。

tables[0] 将是 interfaces[],tables[1] 将是 ipam 等。

除了我最初从数据库收集数据的 ajax 请求 block 。我还有我的函数“inputChoice(string)”,我实际上在其中根据这些数据生成了一个表。我通过更改表格的内部 html 来实现。我不想不必重定向我的页面。这工作正常,但我必须再次为每个表创建一个新的代码块。这些代码块现在非常庞大,因为它们包括用于 DOM 的垃圾收集以及用于处理大量数据集(>10,000)而不会降低浏览器速度的代码。除非必要,否则我将避免发布该 block 。 ajax 调用需要同样的东西。

这是我最初通过生成 javascript 创建空数组变量的 php:

<?php
$sql= "SELECT
TABLE_NAME
FROM information_schema.TABLES
WHERE
TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA='NJVCtestDB'";


$stmt = $DBH->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
echo '<script>';
try{
$stmt->execute();
echo 'var tables = [];';
while($row = $stmt->fetch()){
echo 'var '.$row['TABLE_NAME'].' =[];';
echo 'tables += '.$row['TABLE_NAME'].';';
echo 'var '.$row['TABLE_NAME'].'Cols =[];';
}
echo 'console.log(tables[1]);';
}catch(PDOException $e){
echo $e;
}
echo '</script>';
?>

上面的 php 只是通过在我的索引上使用一条语句来调用的。没有 Ajax。

我的 ajax 调用的链接是这样的:

<?
$sql = "DESCRIBE ".$_GET['table'];
$stmt = $DBH->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$colnames;
try{
$stmt->execute();
//$stmt2->execute();
$colnames = $stmt->fetchAll(PDO::FETCH_COLUMN);
}
catch(PDOException $e){
echo $e;
}
foreach($colnames as $value){
print $value ." ";
}
?>

上面的 ajax 服务器只是为了获取列名并返回以空格分隔的字符串中的名称,以便通过 javascript 解析并转换为数组,您可以在我的 ajax 调用中看到。

我的 getJson ajax 代码在这里:

<?php
include "connect.php";
$sql = "DESCRIBE ".$_GET['table'];
$stmt = $DBH->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$colnames;
try{
$stmt->execute();
$colnames = $stmt->fetchAll(PDO::FETCH_COLUMN);
}
catch(PDOException $e){
echo $e;
}
$sql = "SELECT * FROM ".$_GET['table']." LIMIT 17000";
$stmt2 = $DBH->prepare($sql);
$stmt2->setFetchMode(PDO::FETCH_ASSOC);
try{
$stmt2->execute();
while($row = $stmt2->fetch()){
foreach($colnames as $value){
if($row[$value] == null){
$row[$value] = "";
}
}
$row = array('id' => $i) + $row;
$items['post'][]=($row);
$i++;
}
}
catch(PDOExcetipn $e){
echo $e;
}
print json_encode($items);
?>

上面的 php 对我来说似乎有点多余,因为我再次获取了列名。然而这次我也包括了实际数据。一行一行。

这基本上是我为这个项目编写的所有代码。我没有包括的唯一代码是我的 javascript inputChoice() 函数。正如我上面所说的那样,它非常笨重,并且在使用数组时确实没有做 ajax 不做的任何事情。这是一个巨大的帖子,所以我为文字墙道歉。我不确定下一步是什么让我按照我描述的方式更好地编码。任何输入将不胜感激!

最佳答案

如果我是对的,您希望自动生成表格。

您的索引 php block 从数据库中检索所有表。

$sql=   "SELECT 
TABLE_NAME
FROM information_schema.TABLES
WHERE
TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA='NJVCtestDB'";

所以我们需要将这些添加到主表伪代码:

tables = [];
for (table in tableSQL)
{
tables[table] = tableSQL[table];
tables[table]['cols'] = [];
}

现在您有一个包含所有表的主表数组。让我们遍历这些。 伪代码:

for (table in tables)
{
retrieveColsWithData(table);

}

function retrieveColsWithData(tableKey)
{
//table = key = table name in DB
$.ajax({url:"/ryan/nonEmber/ajax.php?table="+table, etc.
//rest of the ajax call you're doing. Pass the key var to the JSON function
});
}

上面的函数遍历所有表并检索 colls。当 JSON 请求返回时,您只需将 cols 添加到 table[key]['cols']。现在您可以使用 for inObject.keys 简单地遍历 tables master 并绘制包含的 HTML数据。

您可以重新使用 retrieveColsWithData 连接到您的 inputChoice 以重新加载数据。

关于javascript - 从 MySQL DATABASE(即多个表)创建 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25173272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com