我在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
这是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 DB具有以下结构:
param {tck(VARCHAR255),value(real)}
当我运行代码时,什么也没发生。我很确定问题出在附近:$data = json_decode($json);
为了方便起见,我直接在我的php代码中复制JSON字符串,如下所示:
<?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']
));
}
?>
问题是什么? 谢谢
答案 0 :(得分:0)
您正在调用您发布的字段field1
,因此该行可能必须是:
$data = json_decode($_POST['field1']);
你还应该将你的prepare语句移出循环;你只需准备一次。
答案 1 :(得分:0)
你看过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
答案 2 :(得分:0)
我终于找到了:-)。问题出在发送对象和用于我的数字的分隔符。
将“,”转换为“。”后在我的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 代码&amp; 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很好地将数据插入到数据库中。
谢谢大家的帮助。