下面是我的PHP代码,工作正常:
<?php
//This script checks the id and code of the already registered user from the database. If correct it returns the other details otherwise the respective error
//starting session
session_start();
//catching data from client
$id=$_POST['id'];
$code=$_POST['code'];
if($id&&$code)//checking if the data is not empty
{
//Connecting to server
($connect=mysqli_connect('localhost','root','','ohhell')) or exit("Connection Failed");
//Selecting user for given id
$result=mysqli_query($connect,"SELECT * FROM users WHERE id='$id'");
//Counting number of rows
$numrows=mysqli_num_rows($result);
if($numrows!=0)
{
//Creating associative array
$row=mysqli_fetch_assoc($result);
//freeing result set
mysqli_free_result($result);
//fetching code from database
$db_code=$row['code'];
$code=md5($code);
//checking if the codes match
if($code==$db_code)
{
//change status
mysqli_query($connect,"UPDATE users SET status='yellow' WHERE id='$id'");
$_SESSION['id']=$row['id'];
$_SESSION['name']=$row['name'];
$_SESSION['location']=$row['location'];
$name=$row['name'];
$location=$row['location'];
//closing connection
mysqli_close($connect);
//returning values to client
exit("$name\n$location");//Successful Login. Client can now create an object and switch the screen
}
else
{
exit("Invalid Player Code");//Unsuccessful Login
}
}
else
exit("Invalid Player ID");//Unsuccessful Login
}
else
exit("Incomplete Details");//Unsuccessful Login
&GT;
它将相应的错误消息或播放器的相应详细信息返回给c#客户端。以下是接收数据的客户端代码:
WebRequest request = WebRequest.Create(URL);
Stream dataStream;
WebResponse response;
StreamReader reader;
response = request.GetResponse();
dataStream = response.GetResponseStream();
reader = new StreamReader(dataStream);
responseFromServer = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();
成功接收数据后,c#客户端在&#34; \ n&#34;的帮助下分离数据。然后创建一个类的对象,并将接收到的数据填充到该类的相应数据成员中。
现在问题来了,因为我现在正在测试一切正常。但是,我的问题是,由于正在读取的数据将以字符串的形式出现,我如何在客户端确保数据实际上已成功接收,并且检索到的字符串实际上包含数据而不是错误信息。
我的意思是假设连接到php或任何其他网络错误时发生内部错误,返回相应的错误,也就是字符串的形式,现在我将如何区分客户端应用程序是否应该开始分离来自字符串的数据来制作对象,或者它应该以错误终止。 对于我在php中包含的错误,我可以在c#客户端中使用相应的if()条件,但这不是正确的方法,因为错误不能保证仅限于php脚本中考虑的错误。可能会返回大量错误,因此在这种情况下应采取何种方法来实际区分错误和实际数据。
可能的方法是在信号前加上说&#34; 1&#34;在发送之前对数据进行测试,并在客户端测试信号,以确定接收的字符串是否以&#34; 1&#34;开头。如果是,则进行分离,否则显示相应的错误消息。但是这种方法也不是最优的,因为如果错误本身以1开始,它将失败。
那么通过php脚本以最佳方式将数据发送到c#应该做些什么呢?
很抱歉这么长的说明!等待援助!!!
感谢亿万亿......:)
答案 0 :(得分:2)
您可以使用HTTP Status codes来确定天气是否发生错误。 如果在运行所述php脚本期间发生错误,即使用http_response_code,则php可以设置相应的HTTP头。 如果Startus代码没问题,您可以解析响应(如评论中所述,使用json)并检索结果。如果网络通信中发生错误,您将在客户端自行生成相应的错误。如果PHP中发生错误,您还可以通过解析响应来检索错误,从而检索错误消息。
PHP中的简单示例
$response = array();
$responseCode = null;
try {
// some code is executed
$responseCode = 200;
}
catch (Exception $e) {
// an error occured and we have to add it to our response
$response['error'] = array('errorcode' => $e->getCode(), 'error' => $e->getMessage());
$responseCode = 500;
}
http_response_code($responseCode);
echo(json_encode($response ));
现在在你的c#中,只需检查标题即可。如果它是500(表示发生错误),则json_decode结果并获得错误。如果它是200(意味着OK ),则json_encode结果。如果是其他任何内容,请根据链接HTTP错误代码列表对其进行响应。
答案 1 :(得分:2)
您可以使用http status codes来表示错误情况。
目前您似乎只使用200 OK
(默认情况下),但是Invalid Player Code
可能会产生401 Unauthorized
或403 Forbidden
(如果这意味着某种授权)。
在c#端,您可以通过HttpWebResponse.StatusCode property
获取该状态代码答案 2 :(得分:1)
我参考了Vikas Prasad的评论问题:&#34; @ReeCube我可以实现我对尝试JSON或XML的程序的所有要求。如果是的话,你可以指点我的具体教程。我不知道这两个。还有哪一个更喜欢?&#34;
JSON或XML 只是传输数据的方式以及您阅读后的方式,需要php和c#才能使用JSON或XML < / strong>即可。我更喜欢JSON ,但我不确定它在C#上的表现如何,我从未测试过它。Here you can find an JSON API for C#.
但首先应该为PHP服务器添加JSON。在PHP上,使用 JSON非常容易,有一个json_encode和json_decode函数。在您的情况下,您只需要json_encode函数,因为在服务器端,您只想为客户端生成JSON。如何使用json_encode非常得到Google和PHP文档的良好支持,但如果您有任何疑问,请在评论中提问。
这是一个小例子:
<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>