2016-06-21 87 views
0

我有一個PHP腳本,它從我的C#代碼中獲取它的數據。我的C#代碼將POST數據發送到我的PHP腳本,包括一個base64字符串和一個文件名。有了這兩段數據,它應該在文件夾JSON中創建一個帶有文件名的JSON文件,然後它應該將解碼後的base64字符串寫入它剛創建的文件。在此之後,它應該將JSON數據保存到數據庫。但有一個問題,它不會創建JSON文件,它會將空白數據保存到我的數據庫中。以下是我迄今爲止:PHP腳本沒有創建和寫入JSON文件

PHP:

<?php 
$link = new mysqli($host, $user, $pass, $db); 
if($link ->connect_errno) 
{ 
    echo 'Database connection wrong<br/>'; 
} 
else 
{ 
    if(isset($_POST['filename']) && isset($_POST['b64string'])) 
    { 
     $jsonstring = base64_decode($_POST['b64string']); 
     $filename = $_POST['filename'] . '.json'; 

     $create = fopen(__DIR__. "/json/" . $filename, "W+"); 
     fwrite($create, $jsonstring); 

     $json = fread($create, filesize(__DIR__. "/json/" . $filename)); 
     fclose($create); 

     $obj = json_decode($json); 

     $query_opslaan = "INSERT INTO SalesKicker (BedrijfsNaam, ContPers, TelNr, Email, Land, Plaats, POC) VALUES ('". $obj->bedrijfsNaam ."' , '". $obj->ContPers ."', '". $obj->TelNum ."', '". $obj->email ."', '". $obj->Land ."', '". $obj->Plaats ."', '". $obj->PostCode ."')"; 



     mysqli_query($link, $query_opslaan) or die(mysqli_error($query_opslaan)); 
    } 
    else 
    { 
     echo 'ERROR: no data!'; 
    } 

} 
?> 

它獲得是從下面的C#腳本中的數據:

 if (reqCat == "bvg") 
     { 
      json = "{\"bedrijfsNaam\":\"" + bedrijfsNaam + "\"," + 
          "\"ContPers\":\"" + ContPers + "\"," + 
          "\"TelNum\":\"" + TelNum + "\"," + 
          "\"email\":\"" + email + "\"," + 
          "\"Land\":\"" + Land + "\"," + 
          "\"Plaats\":\"" + Plaats + "\"," + 
          "\"PostCode\":\"" + PostCode + "\"}"; 

      var b64bytes = System.Text.Encoding.UTF8.GetBytes(json); 
      b64encode = System.Convert.ToBase64String(b64bytes); 

      using (WebClient client = new WebClient()) 
      { 
       byte[] sendB64 = client.UploadData("http://" + ConfigurationManager.AppSettings["scripturi"].ToString() + "SalesKicker.php", "POST", 
       System.Text.Encoding.ASCII.GetBytes("b64string=" + b64encode + "&filename=" + dt.bedrijfsNaam)); 
      } 
     } 

這是我的文件夾結構:

public_html(這是所有PHP的東西所在) - > json(它應該保存的文件夾)

我現在不知道該怎麼做,所以我來這裏發佈我的問題。有人可以幫助我,並告訴我我在這裏做錯了什麼嗎?

+0

'$ jsonstring'的內容是什麼? – jeroen

+0

json文件夾是否存在?運行這段代碼的用戶能夠創建一個文件? – TehSphinX

+0

$ jsongstring包含在PHP腳本中正確解碼的正確數據@jeroen –

回答

0

那一刻,當一個C#程序員忘記對高速緩存。我有點笨拙,但是在搜索瞭如何在PHP中清除緩存的方法後,我發現了它。看,傳說中的clearstatcache()方法。我的最終PHP代碼如下所示:

if(isset($_POST['filename']) && isset($_POST['b64string'])) 
    { 
     clearstatcache();//the solution to my problem 

     $jsonstring = base64_decode($_POST['b64string']); 

     $filename = $_POST['filename'] . '.json'; 

     $create = fopen(__DIR__. "/json/" . $filename, "w+"); 
     fwrite($create, $jsonstring); 

     $json = fread($create, filesize(__DIR__. "/json/" . $filename)); 
     fclose($create); 

     $obj = json_decode($json); 

     $query_opslaan = "INSERT INTO SalesKicker (BedrijfsNaam, ContPers, TelNr, Email, Land, Plaats, POC) VALUES ('". $obj->bedrijfsNaam ."' , '". $obj->ContPers ."', '". $obj->TelNum ."', '". $obj->email ."', '". $obj->Land ."', '". $obj->Plaats ."', '". $obj->PostCode ."')"; 



     mysqli_query($link, $query_opslaan) or die(mysqli_error($query_opslaan)); 
    } 
+0

現在你提到你的解決方案我有一個問題:你爲什麼要保存JSON到一個文件,只從它那裏讀取它。同時考慮使用不同數據的兩個呼叫。當它們都寫入同一個文件時,它們不應該互相干擾嗎?或者文件名永遠不變? – TehSphinX

+0

我真的不知道。但我的客戶想要它。不要問我爲什麼 –

0

我不知道,在第一,但測試這裏的解決方案後:

錯誤:

$create = fopen(__DIR__. "/json/" . $filename, "W+"); 

正確:

$create = fopen(__DIR__. "/json/" . $filename, "w+"); 

這是一種愚蠢的,但資本的模式信無效。希望這能解決問題:)

+0

它仍然不會傷心地創建文件。但是,感謝大寫字母的回答! –

+0

我不知道你是否因爲大寫字母而看到錯誤。也許現在有另一個PHP錯誤,你看不到。你能確定你能看到PHP錯誤嗎? – TehSphinX

+0

其實這是一個警告:警告:fopen(./test.json):未能打開流:第3行中的./test.php中設備的不適當的ioctl – TehSphinX

1

明白了! 您在POST正文中發送'filename'參數,但在GET數組中檢查它。所以你甚至不會進入你的if(){}語句。 您需要要麼改變

if(isset($_GET['filename']) && isset($_POST['b64string'])) 

if(isset($_POST['filename']) && isset($_POST['b64string'])) 

要麼改變在C#

  byte[] sendB64 = client.UploadData("http://" + ConfigurationManager.AppSettings["scripturi"].ToString() + "SalesKicker.php", "POST", 
      System.Text.Encoding.ASCII.GetBytes("b64string=" + b64encode + "&filename=" + dt.bedrijfsNaam)); 

  byte[] sendB64 = client.UploadData("http://" + ConfigurationManager.AppSettings["scripturi"].ToString() + "SalesKicker.php?filename=" + dt.bedrijfsNaam, "POST", 
      System.Text.Encoding.ASCII.GetBytes("b64string=" + b64encode)); 
+0

對呀!你甚至把它從$ _POST中取出,但是if是$ _GET。 – TehSphinX

+0

如果您應用這兩個更正它將無法工作=)。你只需要其中一個來使其工作。 – spirit

+0

我改變了它來通過URL來嘗試它,它應該是一個POST –