繁体   English   中英

如何通过调用PHP网页获取值?

[英]How can I get a value back from a call to my PHP web page?

我正在构建一个C#应用程序,它需要调用一个网页(在PHP )来请求对数据库中的数据执行验证。 数据通过URL HTTP参数提供给PHP页面。

我想从调用我的PHP网页中检索一个响应值。 在这个具体的例子中,我只需要一个Boolean值。 但是,我学习如何请求任何东西,甚至是一个请求中的多个值(如果可能的话),这似乎是谨慎的。

这是我正在调用的PHP页面的简化版本:

<?php
    $type = $_GET['type'];
    $accessid = $_GET['accessid'];
    $license = $_GET['license'];
    $machine = $_GET['machine'];
    $osver = $_GET['osver'];
    $ip = getenv("REMOTE_ADDR");

    $query = "select * from validatetable where licnum = '" . $license . "'";
    if ($result = db_doquery($query))
    {
        if (db_dofetcharray($result))
        {
            $query = "update validatetable set lastdate = CURRENT_TIMESTAMP, lastmachine = '" . $machine . "', accessip = '" .  $ip . "', osver = '" . $osver . "' where type = '" . $type . "' and licnum = '" . $license . "'";
            db_doquery($query);
        }
        else
        {
            $query = "insert into validatetable set type = '" . $type . "', name = '<unknown>', licnum = '" . $license . "', accessid = '" . $accessid . "', lastdate = CURRENT_TIMESTAMP, machine = '" . $machine . "', accessip = '" .  $ip . "', osver = '" . $osver . "'";
            db_doquery($query);
        }
    }
?>

这个PHP页面只是接收值,并在数据库表中插入或更新记录。 这将继续,但还有另一个表,我想从中提取信息,与提供的信息进行比较,并将验证指示符作为Boolean返回。

这是我在C#应用程序中的当前请求代码:

String webUrl = String.Format("http://www.mywebsite.com/validate.php?type=type&accessid={0}&license={1}&machine={2}&osver={3}.{4}", accessID, licNum, clientMachineName, Environment.OSVersion.Version.Major, Environment.OSVersion.Version.Minor);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(webUrl);
request.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
    using (Stream dataStream = response.GetResponseStream())
    {
        using (StreamReader reader = new StreamReader(dataStream, Encoding.UTF8))
        {
            String theResponse = reader.ReadToEnd();  //<--- THIS LINE
        }
    }
}
response.Close();

标注的行导致变量包含要返回的页面的完整HTML。

我想知道的是我如何能够将这些响应作为一个或多个回复(无论可能的是什么):

  1. 单个值
  2. 一组价值观
  3. 从中可以可靠地提取值的东西

您的返回真的只是回显或打印 - 只需显示您想要返回到c#脚本的值。

<?php
if( // true ) {
echo 'TRUE';
} else { 
echo 'FALSE';
}

当然你要返回一个字符串,而不是一个布尔值。 但是你可以创建一个数组或一个对象,并使用json_encode()将值传递给c#。

函数db_doquery的代码是什么?

您是否尝试使用if语句来查看查询是否已成功运行?

    if (db_dofetcharray($result))
    {
        $query = "update validatetable set lastdate = CURRENT_TIMESTAMP, lastmachine = '" . $machine . "', accessip = '" .  $ip . "', osver = '" . $osver . "' where type = '" . $type . "' and licnum = '" . $license . "'";

        if(db_doquery($query))
        {
            echo '1';
        }
        else
        {
            echo '0';
        }
    }
    else
    {
        $query = "insert into validatetable set type = '" . $type . "', name = '<unknown>', licnum = '" . $license . "', accessid = '" . $accessid . "', lastdate = CURRENT_TIMESTAMP, machine = '" . $machine . "', accessip = '" .  $ip . "', osver = '" . $osver . "'";

        if(db_doquery($query))
        {
            echo '1';
        }
        else
        {
            echo '0';
        }
    }

标注的行导致变量包含要返回的页面的完整HTML。

嗯,那是因为PHP页面发出的是一个网页,而不是一个特定的值(作为API调用)。 您可以通过以下几种方式解决此问题:

  1. 您可以将页面响应加载到DOM解析器(例如, HtmlAgilityPack ,尽管还有其他),并解析出您想要的值。
  2. 您可以让PHP代码仅以某种结构化形式发出所需的值。 虽然你仍然只能从中获取一个字符串,但如果它遵循该对象的结构,则可以更容易地将其反序列化为对象。 或者,如果值非常简单(数字,布尔值等),那么您可以将结果解析为该类型。

由于你有FULL html对象返回,你可以随时做我做的事,在某些标签中设置参数(我称之为'数据',你可以随意调用它们!)你可以用PHP做什么:

send('this string should be returned with data tags');
function send(dat) {
  echo '<data>'. $dat .'</data>'
}

然后在C#中删除标签:

public string removeDataTags(string fullhtml) {
  string rmt = fullhtml.Substring(fullhtml.IndexOf("<data>") + ("<data>").Length);
  rmt = rmt.Substring(0, rmt.IndexOf("</data>"));
  return rmt;
}

你现在要做的就是:

theResponse = removeDataTags(theResponse);

发送的数据将在theResponse字符串中提供。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM