Php 使用JSON将excel数据存储在MySQL数据库中

Php 使用JSON将excel数据存储在MySQL数据库中,php,mysql,json,vba,xmlhttprequest,Php,Mysql,Json,Vba,Xmlhttprequest,我想将excel电子表格中的两列数据存储在MySQL数据库中(目前在本地托管) 我将电子表格转换为JSON字符串,并通过XMLHTTP发送给PHP代码。以下是我的VBA代码: Sub sendjson() Dim json As String Dim filed1 As String Dim i As Integer Dim j As Integer Dim data As String Worksheets("param").Range("C1").Select data = "{" + C

我想将excel电子表格中的两列数据存储在MySQL数据库中(目前在本地托管)

我将电子表格转换为JSON字符串,并通过XMLHTTP发送给PHP代码。以下是我的VBA代码:

Sub sendjson()
Dim json As String
Dim filed1 As String
Dim i As Integer
Dim j As Integer
Dim data As String
Worksheets("param").Range("C1").Select

data = "{" + Chr(34) + "data" + Chr(34) + ":["

j = 2
Do While Not (IsEmpty(ActiveSheet.Cells(j, 3)))
    j = j + 1
Loop

i = 2
Do While Not (IsEmpty(ActiveSheet.Cells(i, 3)))
    If i < j - 1 Then
    data = data + ActiveSheet.Cells(i, 3) + ","
    Else
    data = data + ActiveSheet.Cells(i, 3) + "]}"
    End If
    i = i + 1
Loop
Worksheets("param").Range("D1").Value = data

json = data

Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "POST", "http://localhost/test/jsontomysql.php", False
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.send ("field1=" & json)
Set objHTTP = Nothing
End Sub
似乎我在我的第一个foreach循环的第26行有一个错误

Warning: Invalid argument supplied for foreach() in C:\wamp\www\finance\jsontomysql.php on line 26
编辑:

问题一定是在VBA和PHP之间,因为当我这样做时,SQL DB得到了很好的更新:

<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
//$phpArray = json_decode($_POST['field1']);

$data = '{"u1":{"tck":"EUSA1 Curncy","value":0.005},"u2":{"tck":"EUSA2 Curncy","value":0.0049},"u3":{"tck":"EUSA3 Curncy","value":0.0048},"u4":{"tck":"EUSA4 Curncy","value":0.0047},"u5":{"tck":"EUSA5 Curncy","value":0.0046},"u6":{"tck":"EUSA6 Curncy","value":0.0045},"u7":{"tck":"EUSA7 Curncy","value":0.0044},"u8":{"tck":"EUSA8 Curncy","value":0.0043},"u9":{"tck":"EUSA9 Curncy","value":0.0042}}';
var_dump($data);

$phpArray = json_decode($data, true);
var_dump($phpArray);

foreach ($phpArray as $u) {  
        $req = $bdd->prepare('INSERT INTO param (tck, value) VALUES(:tck, :value)');
        $req->execute(array(
            ':tck'=>$u['tck'],
            ':value'=>$u['value']
        ));
}
?>

问题是什么?
谢谢

您正在调用您发布的字段
field1
,因此该行可能必须类似于:

$data = json_decode($_POST['field1']);

您还应该将prepare语句移出循环;你只需要准备一次。

你看过json_解码($json)实际输出的内容了吗?您是否以一种希望能够像您正在尝试的那样对数据进行迭代的形式获取数据

只需尝试打印($json);调试输出以进行快速验证

看来json_解码失败了。在我的测试中,这是因为没有引用您的“值”

例如:

<?php

$data = '{"u1":{"tck":"EUSA1 Curncy","value":"0,005"},"u2":{"tck":"EUSA2 Curncy","value":"0,0049"},"u3":{"tck":"EUSA3 Curncy","value":"0,0048"},"u4":{"tck":"EUSA4 Curncy","value":"0,0047"},"u5":{"tck":"EUSA5 Curncy","value":"0,0046"},"u6":{"tck":"EUSA6 Curncy","value":"0,0045"}}';

$phpArray = json_decode($data, true);

foreach ($phpArray as $key => $value) {
  print "$key\n";
  print "$value[tck]\n";
  print "$value[value]\n";
  print "\n\n";
}

?>
我终于找到了:-)。问题在于发送对象和用于我的数字的分隔符

在将Excel电子表格中的“.”转换为“.”后,我必须解决发送vba对象的问题

工作代码如下所示:

VBA代码:(将数据转换为JSON字符串并将字符串发送到我的PHP页面)

Sub-sendjson()
作为整数的Dim i
作为整数的Dim j
将数据设置为字符串
工作表(“参数”).范围(“D1”).选择
数据=“{”
j=2
不执行时执行(IsEmpty(ActiveSheet.Cells(j,4)))
j=j+1
环
i=2
不执行时执行(IsEmpty(ActiveSheet.Cells(i,4)))
如果iphp
设置objHTTP=CreateObject(“WinHttp.WinHttpRequest.5.1”)
服务器URL=”http://localhost/finance/jsontomysql.php"
objHTTP.Open“POST”,serverURL,False
objHTTP.setRequestHeader“内容类型”、“应用程序/x-www-form-urlencoded”
objHTTP.send(“field1=“&data”)
设置objHTTP=Nothing
端接头
我的PHP代码和MySQL查询:

<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
// $file = fopen("test.txt","w");
// echo fwrite($file,$_POST['field1']);
// fclose($file);
$data = $_POST['field1'];
$phpArray = json_decode($data, true);
foreach ($phpArray as $u) {  
        $req = $bdd->prepare('INSERT INTO param (tck, value) VALUES(:tck, :value)');
        $req->execute(array(
            ':tck'=>$u['tck'],
            ':value'=>$u['value']
        ));
}
?>

为了确保PHP代码接收到字符串,我将结果写入.txt文件(=代码中的注释部分)

现在,MySQL数据库很好地将值插入数据库中


谢谢大家的帮助。

如何获取变量$json的值?如果我引用我的“值”,它们将被视为字符串。我需要用浮子。但是,我将“,”改为“,”,现在,我的值被公认为浮动。但是,错误是foreach循环。。。你有什么想法吗?我在上面编辑了我的答案。实际上,我直接在PHP代码中复制JSON字符串,以查看PHP/mysql代码是否正常工作。实际上是的。问题似乎出在VBA的发送部分,但我对此一无所知。。。你有什么想法吗?非常感谢。
<?php

$data = '{"u1":{"tck":"EUSA1 Curncy","value":"0,005"},"u2":{"tck":"EUSA2 Curncy","value":"0,0049"},"u3":{"tck":"EUSA3 Curncy","value":"0,0048"},"u4":{"tck":"EUSA4 Curncy","value":"0,0047"},"u5":{"tck":"EUSA5 Curncy","value":"0,0046"},"u6":{"tck":"EUSA6 Curncy","value":"0,0045"}}';

$phpArray = json_decode($data, true);

foreach ($phpArray as $key => $value) {
  print "$key\n";
  print "$value[tck]\n";
  print "$value[value]\n";
  print "\n\n";
}

?>
marks-mac-pro:~ mstanislav$ php data.php 
u1
EUSA1 Curncy
0,005


u2
EUSA2 Curncy
0,0049


u3
EUSA3 Curncy
0,0048


u4
EUSA4 Curncy
0,0047


u5
EUSA5 Curncy
0,0046


u6
EUSA6 Curncy
0,0045
Sub sendjson()
Dim i As Integer
Dim j As Integer
Dim data As String
Worksheets("param").Range("D1").Select

data = "{"

j = 2
Do While Not (IsEmpty(ActiveSheet.Cells(j, 4)))
    j = j + 1
Loop

i = 2
Do While Not (IsEmpty(ActiveSheet.Cells(i, 4)))
    If i < j - 1 Then
    data = data + ActiveSheet.Cells(i, 4) + ","
    Else
    data = data + ActiveSheet.Cells(i, 4) + "}"
    End If
    i = i + 1
Loop
Worksheets("param").Range("E1").Value = data

'data --> php
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    serverURL = "http://localhost/finance/jsontomysql.php"
    objHTTP.Open "POST", serverURL, False
    objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    objHTTP.send ("field1=" & data)
Set objHTTP = Nothing
End Sub
<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
// $file = fopen("test.txt","w");
// echo fwrite($file,$_POST['field1']);
// fclose($file);
$data = $_POST['field1'];
$phpArray = json_decode($data, true);
foreach ($phpArray as $u) {  
        $req = $bdd->prepare('INSERT INTO param (tck, value) VALUES(:tck, :value)');
        $req->execute(array(
            ':tck'=>$u['tck'],
            ':value'=>$u['value']
        ));
}
?>