2016-06-21 4 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): не удалось открыть поток: несоответствующий ioctl для устройства в ./test.php в строке 3 – TehSphinX

1

Понял! Вы отправляете параметр «filename» в тело POST, но проверяете его в массиве 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

Я поменял его на GET, чтобы попробовать его по URL-адресу, это должно быть POST –