c# - 使用PHP显示用于C#程序的SQL表

标签 c# php mysql sql

我一直在网站的管理面板上工作,以更轻松地控制对PHP和用户的访问。
我不想编写直接访问程序中SQL数据库的代码,但其他人将使用它,并且我不想冒险有关数据库泄漏或人们可以访问它的信息。
所以我试图获取我的用户数据库的所有内容。 (一个名为“ UserDB”的表)并将其回显到网站上,我知道我可以通过像这样的表格式来做到这一点:http://www.roseindia.net/sql/mysql-table/sqltable.shtml但我认为这意味着要进行更多的编码才能删除所有HTML,并且我不想导入依赖项,例如HtmlAgilityPack。有什么办法可以让我浏览整个表格,以便可以使用拆分器访问每个人的信息?

即遍历SQL表的大小,并获得如下信息:

Garry:garrysemail@hotmail.com:registerd-Bob:bobs@gmail.com:guest


而且我可以使用C#拆分“-”来分隔实际用户,并使用“:”来分隔信息。

这是我的C#项目中我要实现的图像。我希望这是足够的信息供您回答我的问题。



忽略“测试” /“测试2”,他们在哪里可以查看是否可以将纯字符串添加到列表框中。我以前从未使用过它们。

最佳答案

好的,所以看来您只需要制作一个小的PHP页面,即可以指定的格式(<用户名>:<电子邮件>:<用户类型> -...)从SQL表返回数据。我相信您可以做到,只需执行以下操作即可:

function escape($str)
{
    $retn = str_replace("\\","\\\\",$str);
    $retn = str_replace("-","\\-",$retn);
    $retn = str_replace(":","\\:",$retn);
}
$result = SQL_QUERY_FUNCTION("SELECT * FROM UserDB");
$rowset = SQL_GET_ROWSET($result);
SQL_FREE_RESULT($result);
for ($i=0; $i<count($rowset); $i++)
{
    echo escape($rowset[$i]['username']);
    echo ":";
    echo escape($rowset[$i]['email']);
    echo ":";
    echo escape($rowset[$i]['usertype']);
    echo "-";
}


(我不确定您打算如何获取SQL数据库,只需将函数替换为它们的近似等效项即可)

另外,如果您想知道为什么必须使用转义功能,那是因为它对站点安全至关重要。不过,在这种情况下并不一定要这样,但是如果您扩展功能,则可能会出现漏洞:想象一封带有-的电子邮件:
    Garry:garry-email@hotmail.com:registered -...
    成为Garry:garry和email@hotmail.com:拆分后注册!

然后,C#循环可能看起来像

List<List<string>> users = new List<List<string>>();
List<string> user = new List<string>();
StringBuilder potato = new StringBuilder();
int i=0;
bool escaped=false;
while (i<userDB.Length)
{
    if (userDB[i] == '\\' && !escaped)
    {
        escaped = true;
    }
    else if (userDB[i] == ':' && !escaped)
    {
         user.Add(potato.ToString());
         potato.Clear();
    }
    else if (userDB[i] == '-' && !escaped)
    {
         user.Add(potato.ToString());
         potato.Clear();
         users.Add(user);
         user = new List<string>();
    }
    else
    {
        potato.Append(userDB[i]);
        escaped = false;
    }
}


如果愿意,您可以将:s和-s编码为特殊的unicode字符,然后只需使用string.Split()函数就可以轻松一些,但是这种方式也有效,并且您无需担心编码。

HTH。

编辑:
因此,我们正在做的是以一种可以再次读取它们的方式打包字符串。这里最大的问题就是转义字符串,就像其他人提到的那样,JSON的确是前进的方向(忘了那个……)。尽管如此,我还是在这里进一步解释我的答案。因此,我们的想法是,我们使用:和-作为标记,我们使用它们将数据分离为可读取的块。如果我们使用此代码对4个hello进行编码,则它将如下所示:

Hello:Hello:Hello:Hello


假设我们想对这4行进行编码

He:llo
Hell:o
Hello
Hello


因此,如果我们忽略转义,我们将得到

He:llo:Hell:o:Hello:Hello


当程序尝试将它们分开时,我们会得到

He
llo
Hell
o
Hello
Hello


这当然不是我们之前提出的内容。因此我们使用转义。您可能知道,如果要在字符串中放入“”,则必须在其前面加上“ \”。为什么呢?相同的原因:计算机无法区分中间的“”和以“。”结尾的“字符串,所以我们“转义”引号,想像一下每当计算机看到一个\时,它将\和下一个字符连接起来,因此现在很容易区分两个引号:

"Hello, My name is "Matt""




"Hello, My name is \"Matt\""


看到?现在,已经知道\会与下一个字符连接起来,唯一的方法是在其中加上两个斜杠:

Console.WriteLine("This is a slash in quotes: \"\\\"");


将输出:

This is a slash in quotes "\"


因此,利用我们现在对转义的了解,我们可以对其进行编程。首先要做的是转义所有转义字符(哪个是)。 (我们必须先执行此步骤,稍后再解释)

$retn = str_replace("\\","\\\\",$str);


它用$ str字符串中的\替换每个\并将其放在$ retn中。
但是请记住:\也是PHP的转义字符!因此,要告诉php替换什么,我们也必须对其进行转义!非常混乱吧。

接下来,我们对字符串中的标记进行转义:这样,-s和:s不会被意外地视为标记。我们只需将-s替换为-,将:s替换为\ :,很容易:

$retn = str_replace("-","\\-",$retn);
$retn = str_replace(":","\\:",$retn);


更难的是阅读:要阅读,我们必须一次遍历一个字符直到到达结尾。因此:每次读取“ \”时,我们都会忽略下一个字符可能具有的任何特殊含义。否则,我们将拆分列表。让我们来看看:

List<List<string>> users = new List<List<string>>();


列表列表:用户名,电子邮件和用户类型三个字符串的集合。

List<string> user = new List<string>();


这是我们要向其添加数据的当前用户。我们将读取的每个字符串添加到此列表中,直到达到-。当我们这样做时,我们只是将用户添加到用户中,并为下一组数据创建新用户。

StringBuilder potato = new StringBuilder();


我不会在这里讨论为什么要使用StringBuilders,但是它的基本原理是它在很大程度上提高了程序速度。

string bob = "";
bob += "a";
bob += "b";
bob += "c";


因此,我们进入了主循环:

while (i<userDB.Length)
{


对于下载的字符串中的每个字符...

if (userDB[i] == '\\' && !escaped)
{
    escaped = true;
}


如果它是一个斜杠并且没有斜杠,请告诉下一个字符前面有一个斜杠。

else if (userDB[i] == ':' && !escaped)
{
     user.Add(potato.ToString());
     potato.Clear();
}


如果它是一个冒号并且没有在前面加上斜杠,则将已加载字符串的当前内容放入用户中,并清除它以获取更多数据。

else if (userDB[i] == '-' && !escaped)
{
     user.Add(potato.ToString());
     potato.Clear();
     users.Add(user);
     user = new List<string>();
}


如果它是-并且不以斜杠DID开头,则将已加载字符串的当前内容放入用户中,然后清除它以获取更多数据,并将该用户添加到用户列表中,并为下一个大量数据创建另一个用户。

else
{
    potato.Append(userDB[i]);
    escaped = false;
}


如果该字符已转义,或者不是/ 、:或-,则将其添加到当前加载的字符串中,并清除所有转义标志(即,告诉下一个字符在其前面没有斜杠。

希望这能说明问题。就像我说的那样,JSON还是为您完成了所有这些工作。但是,如果您不了解下面的内容,那么您将无法学习如何自己做!

编辑2

在计算机中存储字符串的主要方法有两种。第一种方法是写单词的长度,然后写单词。

5 Hello


第二种方法是将字符串存储在内存中,并以null(0)结尾。您了解字母取决于其编码(UTF8,UTF16 / Unicode,UTF32)由1、2或4个字节的Unicode表示。实际上,字母“ A”存储为数字65。B是数字66,依此类推。关键是我们选择数字0的终止符。因此,实际上“ ABC”是这样存储的(十进制):

65 66 67 0


但是,如果我们不用英语写字符串怎么办。如果我们需要在该字符串的中间放置一个0,该怎么办:

1 2 3 4 0 1 2 3 4 0


当计算机读取该字符串时,它认为该字符串在中间的0处结束而不是在结尾处结束。那我们现在怎么办?在大多数情况下,我们选择选项1。先传输长度,然后传输字符串本身。您可以执行此操作,但是由于我不愿讨论的原因,它不能很好地工作。

那么,如何区分中间的0和最终的null 0?我们可以选择说5来结束该字符串,除非我们也需要在字符串中输入5,否则不会出错。所以我们做些聪明的事。我们选择一个转义字符:它从字符串读取循环中转义,并使用下一个字符作为指令。这是基本思想:

这个角色是逃脱角色吗?
是:
抓住下一个字符。
如果下一个字符是“ A”:
    在字符串中放入转义字符(因此有一种编码转义字符的方法)
如果下一个字符是“!”:
    字符串完成了!
除此以外:
    错误。
没有:
转到下一个字符。

因此,对于这种类型的代码,假设我们选择了转义字符B。让我们尝试对字符串“ ABCDEFG”进行编码。

首先,我们可以看到计算机将到达B并尝试使用“ C”作为指令并出现错误。因此,要对B进行编码,我们将A放在其后。通常,我们选择将转义字符编码的指令字符作为转义字符本身:那样看起来更整洁,没有特殊的原因。接下来需要做的是通过添加“ B!”告诉计算机字符串已完成。到最后。因此,我们的最终字符串如下所示:

ABACDEFGB!


那么这如何解决您的问题呢?您有希望用冒号分开的电子邮件地址和用户名。如果用户名本身包含冒号,则程序将假定已到达名称的末尾。

Bob:Boberty:Bob@bob.com:registered


计算机将自动假定“ Boberty”是该电子邮件的真实来源。
您需要告诉它如何区分名称中的冒号和结束字符串的冒号。
逃避是答案。

关于c# - 使用PHP显示用于C#程序的SQL表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168009/

相关文章:

使用 mono 的 lidgren 进行 C# 网络编程

c# - 编译器歧义调用错误-具有Func <>或Action的匿名方法和方法组

php - ffmpeg:如何使用 PHP 获取可用编解码器列表?

mysql - 如果至少满足一个条件,则排除查询中的唯一 ID

php - Joomla - 循环内的 MySQL 查询 - 我想这是不好的做法

mysql - 如何 append 到已经满的 VARCHAR

c# - 计算一批位置的中心

c# - 在 Serilog 中解构时忽略空值

php - 从PHP生产站点获取错误的最佳方法是什么?

php - 仅限于使用 PHP 标记的帖子