Как я могу вернуть значение из вызова моей веб-страницы PHP?

Я создаю приложение C#, которому необходимо обратиться к веб-странице (в PHP), чтобы запросить проверку данных в базе данных. Данные передаются на страницу PHP через параметры HTTP в файле URL.

Я хотел бы получить одно значение ответа обратно от вызова на мою веб-страницу 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. Что-то, из чего я могу надежно извлечь значение

person DonBoitnott    schedule 23.09.2013    source источник
comment
Вы уязвимы для атак с внедрением кода SQL. НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД, как написано.   -  person Marc B    schedule 23.09.2013
comment
@MarcB Понятно. Пока это закрытое тестирование. Далее следует исследование параметризованных запросов PHP. Я откусываю это по кусочку за раз.   -  person DonBoitnott    schedule 23.09.2013


Ответы (4)


Ваше возвращение действительно просто и эхо или печать - просто отобразите значение, которое вы хотите вернуть в свой сценарий С#.

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

конечно, вы возвращаете строку, а не логическое значение. Но вы можете создать массив или объект и использовать json_encode() для передачи значений в С#.

person Technobyte    schedule 23.09.2013

Какой код внутри функции 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';
        }
    }
person Gareth Luckett    schedule 23.09.2013

Отмеченная строка приводит к тому, что переменная содержит полный HTML-код возвращаемой страницы.

Ну, это потому, что страница PHP выдает веб-страницу, а не конкретное значение (как вызов API). Вы можете подойти к этому несколькими способами:

  1. Вы можете загрузить ответ страницы в парсер DOM (например, HtmlAgilityPack, хотя есть и другие) и проанализировать значение ты хочешь.
  2. Вы можете заставить PHP-код выдавать только те значения, которые вам нужны, в какой-то структурированной форме. Хотя из этого вы все равно получите только строку, вам будет проще десериализовать ее в объект, если она будет следовать структуре этого объекта. Или, если значение действительно простое (число, логическое значение и т. д.), вы можете просто преобразовать результат в этот тип.
person David    schedule 23.09.2013

Поскольку у вас есть возвращаемый объект FULL html, вы всегда можете сделать то, что делаю я, установить параметры в определенных тегах (я называю свои «данные», вы можете называть их как хотите!) Что вы можете сделать в PHP:

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

Затем разделите теги на С#:

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);

А отправленные данные будут доступны в строке ответа.

person Johnaudi    schedule 23.09.2013