【问题标题】:What is the best way to work with PHP and MySQL in C#在 C# 中使用 PHP 和 MySQL 的最佳方法是什么
【发布时间】:2014-06-24 15:06:40
【问题描述】:

我正在构建一个需要登录的简单应用程序。目前,我直接从我的 C# 应用程序连接到我的数据库,但是由于某种原因,将使用它的大学网络不允许直接连接到 MySQL。我决定看看我将如何从 PHP 中做到这一点。我已经构建了一个简单的登录表单并对其进行了测试,它似乎可以工作。但是我有一些问题需要解决。

我如何首先阻止任何人输入 PHP 文件的地址并取回数据?

其次,我如何才能获得多个结果?假设我创建了一个 PHP 文件,它获取所有用户的文件并将它们存储在 C# 应用程序中,我该如何从 PHP 文件中实际解析它?

这是我在服务器上的 login.php 文件示例:

    <?php

include("connect.php");

$username = mysql_escape_string($_GET['username']);
$password = mysql_escape_string($_GET['password']);

$squery = mysql_query("SELECT * FROM users WHERE username='$username'");
$query = mysql_fetch_array($squery);
$rowcount = mysql_num_rows($squery);

if($rowcount == 1)
{
    if($password != $query['password'])
        echo'Password errata';
    else
        echo 'Login avvenuto';
}
else
    echo 'Account non registrato';

?>

这是我在 C# 上用来访问 PHP 文件的代码:

string Reply = new WebClient().DownloadString("http://127.0.0.1/ClipCloud.Service/account_auth/login.php?username=" + textBox1.Text + "&password=" + textBox2.Text);
            switch (Reply.ToLower())
            {
                case "account non registrato":
                    {
                        MessageBox.Show("Account not registered!");
                        break;
                    }
                case "password errata":
                    {
                        MessageBox.Show("Password error!");
                        break;
                    }
                case "login avvenuto":
                    {
                        MessageBox.Show("Login happened!");
                        break;
                    }
                default:
                    {
                        MessageBox.Show("Error with the remote server, please let try again later!");
                        break;
                    }
            }

对不起,如果这个问题有点令人困惑,我基本上只需要知道如何使用 C# 正确操作具有正确安全性的 PHP 数据库。

【问题讨论】:

  • 如果php可以连接mysql那么c#也可以,反之亦然,这是XY问题
  • 所以你想访问运行 PHP 的服务器上的数据库。所以你想要的可能是一个网络服务。类似于 REST 或 SOAP Web 服务。搜索这些术语以及如何使用 PHP/MySQL 构建一个,然后使用 C# 使用该服务
  • @Lashane:不一定。 php 可能与 mysql 在同一台服务器上运行并通过本地套接字连接,而 c# 远程运行并且必须通过 tcp 连接。并非所有 mysql 安装都设置为 tcp 连接。
  • 是的,基本上,我的服务器将运行 PHP,我只是想要一种安全且简单的方法来用 C# 解析它们
  • 我有一个可能的解决方案,正在编写中。希望问题在我发布之前不会被关闭,哈哈。

标签: c# php mysql


【解决方案1】:

您可以通过实现一个简单的 JSON API 服务器来让 C# 与 PHP 通信。

考虑以下内容:http://yoursite.com/api_server.php

api_server.php

<?php

// Load Request
$api_method = isset($_POST['api_method']) ? $_POST['api_method'] : '';
$api_data = isset($_POST['api_data']) ? $_POST['api_data'] : '';

// Validate Request
if (empty($api_method) || empty($api_data)) {
    API_Response(true, 'Invalid Request');
}
if (!function_exists($api_method)) {
    API_Response(true, 'API Method Not Implemented');
}

// Call API Method
call_user_func($api_method, $api_data);

/* Helper Function */

function API_Response($isError, $errorMessage, $responseData = '')
{
    exit(json_encode(array(
        'IsError' => $isError,
        'ErrorMessage' => $errorMessage,
        'ResponseData' => $responseData
    )));
}

/* API Methods */

function loginUser($api_data)
{
    // Decode Login Data
    $login_data = json_decode($api_data);

    // Dummy Check
    if ($login_data->username == 'test' &&
        $login_data->password == '1234')
    {
        // Success
        API_Response(false, '', 'SUCCESS');
    }
    else
    {
        // Error
        API_Response(true, 'Invalid username and/or password.');
    }
}

?>

然后你像这样通过 C# 与它通信,发出 POST 请求:

using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["api_method"] = "loginUser";
    data["api_data"] = "{ \"username\":\"test\", \"password\":\"1234\" }";

    var responseBytes = wb.UploadValues(
        "http://yoursite.com/api_server.php", "POST", data);

    string responseString = Encoding.Default.GetString(responseBytes);
}

这里,来自 API 服务器的 responseString 将是 json 字符串。要对此进行解码,您可以使用:http://james.newtonking.com/json


这是一个完整的示例,说明如何使用简单的控制台应用程序将所有内容放在 C# 应用程序中:

注意我是如何通过 json 库生成 json 字符串(用于 api_data),而不是手动输入。

using System;
using System.Text;
using System.Net;
using System.Collections.Specialized;
using Newtonsoft.Json;

namespace TemplateFive
{
    public class API_Response
    {
        public bool IsError { get; set; }
        public string ErrorMessage { get; set; }
        public string ResponseData { get; set; }
    }

    public class Login_Request
    {
        public string username { get; set; }
        public string password { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // request params
            string apiUrl = "https://yoursite.com/api_server.php";
            string apiMethod = "loginUser";
            Login_Request myLogin_Request = new Login_Request()
            {
                username = "test",
                password = "1234"
            };

            // make http post request
            string response = Http.Post(apiUrl, new NameValueCollection()
            {
                { "api_method", apiMethod                                    },
                { "api_data",   JsonConvert.SerializeObject(myLogin_Request) }
            });

            // decode json string to dto object
            API_Response r = 
                JsonConvert.DeserializeObject<API_Response>(response);

            // check response
            if (!r.IsError && r.ResponseData == "SUCCESS")
            {
                Console.WriteLine("login success");
            }
            else
            {
                Console.WriteLine("login error, reason is: {0}",
                    r.ErrorMessage);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }

    public static class Http
    {
        public static String Post(string uri, NameValueCollection pairs)
        {
            byte[] response = null;
            using (WebClient client = new WebClient())
            {
                response = client.UploadValues(uri, pairs);
            }
            return Encoding.Default.GetString(response);
        }
    }
}

最后,为了保护整个事情,在 SSL 下运行您的网站,这样您就可以通过以下 URL 访问 api 服务器:https://yoursite.com/api_server.php


这是我在 Firefox 上使用 RESTClient 插件在本地测试 API 服务器。

【讨论】:

  • 谢谢!我会试试这个!
  • 我收到一个错误:错误 1 ​​'Newtonsoft.Json.JsonConvert.DeserializeObject(string, params Newtonsoft.Json.JsonConverter[])' 的最佳重载方法匹配有一些无效参数
  • 我相信我知道问题出在哪里。 wb.UploadValues() 返回一个字节数组,其中 JsonConvert.DeserializeObject&lt;API_Response&gt;() 需要一个字符串。我现在正在更新我的答案。
  • 感谢这段代码,我试图想出所有不同的方式来创建 API,除了使用我的应用程序和它建立在网站上,因此该解决方案非常适合我在 C#/PHP 端的需求
【解决方案2】:

解决方案是:删除 BOM :-)

   static class Http
{
    public static String Post(string uri, NameValueCollection pairs)
    {
        byte[] response = null;
        using (WebClient client = new WebClient())
        {
            response = client.UploadValues(uri, pairs);
        }
        string ret = Encoding.UTF8.GetString(response);
        ret = ret.Trim(new char[] { '\uFEFF', '\u200B' });//removes the BOM 
        return ret;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 2012-08-25
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2011-04-15
    相关资源
    最近更新 更多