我一直在网站的管理面板上工作,以更轻松地控制对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/