【问题标题】:Store excel data in a MySQL DB trough PHP using JSON使用 JSON 通过 PHP 将 excel 数据存储在 MySQL 数据库中
【发布时间】:2013-03-11 06:36:25
【问题描述】:

我在一个 Excel 电子表格中有两列数据,我想将它们存储在 MySQL 数据库中(目前在本地托管)。

我正在将我的电子表格转换为我通过 XMLHTTP 发送到 PHP 代码的 JSON 字符串。这是我的 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

这里是 jsontomysql.php 代码:

<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
$data = json_decode($json);
foreach ($data as $name => $value) {
    foreach ($value as $entry){
        $req = $bdd->prepare('INSERT INTO param (tck, value) VALUES(:tck, :value)');
        $req->execute(array(
            ':tck'=>$entry->tck,
            ':value'=>$entry->value
        ));     
    }
}
?>

我的 MySQL 数据库具有以下结构:

参数{tck(VARCHAR255), value(real)}

当我运行代码时,什么都没有发生。我很确定问题出在:$data = json_decode($json);

为了方便起见,我直接将JSON字符串复制到我的php代码中,如下:

<?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}
    }';

$phpArray = json_decode($data, true);

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

我的第一个 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']
        ));
}
?>

有什么问题? 谢谢

【问题讨论】:

  • 如何获取变量$json的值?

标签: php mysql json vba xmlhttprequest


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你查看过 json_decode($json) 实际输出的内容吗?您是否以您期望能够像尝试那样对其进行迭代的形式取回数据?

    只需尝试执行 print_r($json);以调试输出作为快速验证。

    似乎 json_decode 失败。在我的测试中,这是因为您的“价值观”没有被引用。

    例子:

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

    【讨论】:

    • 如果我引用我的“值”,它们被视为字符串。我需要使用浮动。但是,我把“,”改成了“。”现在,我的价值观被公认为浮动。但是,错误是 foreach 循环......你有什么想法吗?
    • 我在上面编辑了我的答案。实际上,我直接将我的 JSON 字符串复制到 PHP 代码中,以查看我的 php/mysql 代码是否正常工作。实际上是的。问题似乎出在VBA的发送部分,但我对此一无所知......你有什么想法吗?谢谢!
    【解决方案3】:

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

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

    工作代码如下

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

    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 代码和 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 DB 正在将值很好地插入到 DB 中。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 2023-03-05
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2014-06-01
      • 2012-05-14
      • 2016-06-17
      相关资源
      最近更新 更多