您好我一直在Unity制作应用程序,我一直在尝试添加将记录用户操作的代码,即他们已经制作了某个游戏对象。我要做的是写入存储在服务器上的.txt文件我有以下代码,它基于:
http://answers.unity3d.com/questions/984290/upload-txt-file-to-server-using-php.html
并且他们建议它有效,对我而言,它不是在文件中写任何内容。
这是我的PHP代码(SaveData.php):
<?php
$Action = $_GET["action"];
$Date = date('Y/m/d H:i:s');
$myFile = "TestingData.txt";
$fh = fopen($myFile, 'a') or die("can't open file");
fwrite($fh,$Action . "," . $Date . "\n");
fclose($fh);
?>
这是我附加到游戏对象的C#(SaveData.cs)我在检查器窗口中更改了Action值:
using UnityEngine;
using System.Collections;
public class SaveData : MonoBehaviour {
public string postDataURL = "http://arinstructionman.byethost7.com/SaveData.php?"; //add a ? to your url
public string Action;
void Start()
{
StartCoroutine(PostData(Action));
}
IEnumerator PostData(string action)
{
string post_url = postDataURL + "action=" + WWW.EscapeURL(action);
WWW data_post = new WWW(post_url);
yield return data_post;
if (data_post.error != null)
{
print("There was an error saving data: " + data_post.error);
}
}
}
如果我复制post_url值并在浏览器中运行它似乎工作正常,任何人都可以建议我做错了吗?
post_url输出:
http://arinstructionman.byethost7.com/SaveData.php?action=Plane+Visible
非常感谢任何帮助。
答案 0 :(得分:0)
我建议您使用$_POST
代替$_GET
进行尝试,看看是否有不同的回复。
此外,您可以使用file_put_contents
在一行中打开,写入和关闭文件,并使用FILE_APPEND
标志来防止覆盖现有文件。如果该文件不存在,这也将为您创建该文件。
<?php
if(!isset($_POST["action"]))
{
echo ("NO DATA RECIEVED");
return;
}
$action = $_POST["action"];
$date = date('Y/m/d H:i:s');
$data = "{$action},{$date}\n";
$myFile = "TestingData.txt";
if(file_put_contents($myFile, $data, FILE_APPEND))
echo ("success");
else
echo ("failed to write file);
?>
使用WWWform
到POST
数据到PHP文件:
public string postDataURL = "http://arinstructionman.byethost7.com/SaveData.php";
public string Action = "some action";
void Start()
{
StartCoroutine(PostData(Action));
}
IEnumerator PostData(string action)
{
WWWForm form = new WWWForm();
form.AddField("action", action);
WWW dataPost = new WWW(postDataURL, form);
yield return dataPost;
if (dataPost.error != null)
print("There was an error saving data: " + data_post.error);
else
print(dataPost.text);
}
答案 1 :(得分:0)
)
以防万一有人试图实现它并且它不像我的情况那样工作。 我找到了一个修复程序,这肯定不是最好的实现,但至少目前它有效:
如果您的服务器不使用 PHP5,则必须使用 PHP4 功能
(来自:http://memo-web.fr/categorie-php-126/):
function file_put_contents_PHP4($myFile, $data) {
$f = @fopen($myFile, 'w');
if (!$f) {
echo ("failed to write file");
return false;
} else {
$resultat= fwrite($f, $data);
fclose($f);
echo ("success");
return $resultat;
}
}
我们当然可以测试 PHP5 是否可用,但我的 php 知识有点糟糕啊:
if (!function_exists('file_put_contents'))
{
function file_put_contents_PHP4...
{
脚本:
SaveData.php,在您的服务器在线:
<?php
$action = $_POST["action"];
$data = "{$action}";
$myFile = "TestingData.txt";
if($action == "")
{
echo ("NO DATA RECIEVED");
return;
}
else
file_put_contents_PHP4($myFile, $data);
function file_put_contents_PHP4($myFile, $data) {
$f = @fopen($myFile, 'w');
if (!$f) {
echo ("failed to write file");
return false;
} else {
$resultat= fwrite($f, $data);
fclose($f);
echo ("success");
return $resultat;
}
}
?>
Unity c# 脚本:
[SerializeField] private string postDataURL = "http://yourebsite.com/SaveData.php";
[SerializeField] private string Action = "some action";
void Start()
{
StartCoroutine(PostData(Action));
}
IEnumerator PostData(string action)
{
WWWForm form = new WWWForm();
form.AddField("action", action);
WWW dataPost = new WWW(postDataURL, form);
yield return dataPost;
if (dataPost.error != null)
print("There was an error saving data: " + dataPost.error);
else
print(dataPost.text);
}
不要忘记在“SaveData.php”旁边放置一个空文本文件“TestingData.txt”到服务器中。 不要忘记将正确的地址添加到检查器中的 SaveData.php。 我使用 Filezilla 将它们上传到旧的个人服务器,一切都按预期工作。
干杯:-)