Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PHP显示SQL表供C程序使用_C#_Php_Mysql_Sql - Fatal编程技术网

C# 使用PHP显示SQL表供C程序使用

C# 使用PHP显示SQL表供C程序使用,c#,php,mysql,sql,C#,Php,Mysql,Sql,我一直在我的网站的管理面板上工作,以便更容易地控制对PHP和用户的访问。 我不想在程序中编写直接访问SQL数据库的代码,但其他人将使用它,我不想冒数据库信息泄露或有人访问它的风险。 因此,我试图获取我的用户数据库的所有内容。一个名为“UserDB”的表,并将其回显到网站上,我知道我可以通过像这里这样的表格式来实现这一点:但我认为这意味着要做更多的编码来删除所有HTML,我不想导入依赖项,如HtmlAgilityPack。有没有一种方法可以让我浏览整个表格,这样我就可以使用拆分器来访问每个人的信息

我一直在我的网站的管理面板上工作,以便更容易地控制对PHP和用户的访问。 我不想在程序中编写直接访问SQL数据库的代码,但其他人将使用它,我不想冒数据库信息泄露或有人访问它的风险。 因此,我试图获取我的用户数据库的所有内容。一个名为“UserDB”的表,并将其回显到网站上,我知道我可以通过像这里这样的表格式来实现这一点:但我认为这意味着要做更多的编码来删除所有HTML,我不想导入依赖项,如HtmlAgilityPack。有没有一种方法可以让我浏览整个表格,这样我就可以使用拆分器来访问每个人的信息

即通过SQL表的大小进行循环,并获得如下信息:

Garry:garrysemail@hotmail.com:registerd-Bob:bobs@gmail.com:guest
我可以用C来拆分“-”来分离实际用户,用“:”来分离信息

这是我的C项目中的一幅图像,展示了我的目标。我希望这些信息足以让你回答我的问题


忽略Test/test2,看看我是否可以将普通字符串添加到列表框中。我以前从未使用过它们。

我建议您看看JSON。您可以使用JSON_encode$array将多数组转换为JSON,在c语言中,您可以使用JavaScriptSerializer将其解码为数组。

我建议您看看JSON。您可以使用JSON_encode$array将多数组转换为JSON,并且在c语言中,您可以使用JavaScriptSerializer将其解码为数组。

好的,所以您真正需要的似乎是创建一个小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 "-";
}
假设我们想对这4行代码进行编码

He:llo
Hell:o
Hello
Hello
所以如果我们忽视逃跑,我们会

He:llo:Hell:o:Hello:Hello
当程序试图将这些分离出来时,我们会

He
llo
Hell
o
Hello
Hello
这肯定不是我们以前投入的。所以我们用逃跑。您可能知道,如果要在字符串中放置a,则必须在其前面放置\。为什么?同样的原因:计算机无法区分中间部分和结束字符串。因此,我们避开了这一引用。想象一下,每当计算机看到一个\时,它就会加入\和下一个字符。所以现在很容易区分这两个引号:

"Hello, My name is "Matt""
vs

看到了吗?现在,了解到\将自身与下一个字符连接起来,将一个斜杠插入的唯一方法是将两个斜杠插入:

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替换为\:,easy:

$retn = str_replace("-","\\-",$retn);
$retn = str_replace(":","\\:",$retn);
更难的是阅读:要阅读,我们必须一次遍历一个字符的字符串,直到到达末尾。所以:每次我们读a\,我们都会忽略下一个字符可能具有的任何特殊含义。否则,我们就把名单分开。让我们来看一看:

List<List<string>> users = new List<List<string>>();
我不会在这里讨论为什么我们应该使用StringBuilder,但它的基本原理是,它在很大程度上提高了程序速度

string bob = "";
bob += "a";
bob += "b";
bob += "c";
所以我们进入了主循环:

while (i<userDB.Length)
{
如果它是一个斜杠,而斜杠没有在它前面,告诉下一个字符在它前面有一个斜杠

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>();
}
如果该字符被转义或不是/,:或-,我们将其添加到当前加载的字符串中,并清除任何转义标志,即告诉下一个字符它前面没有斜杠

希望能把事情弄清楚。正如我所说,JSON无论如何都会为您完成所有这些。但是如果你不明白下面隐藏着什么,你就无法学会如何自己去做

编辑2

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

5 Hello
第二种方法是将字符串存储在内存中,并以null 0结尾。您知道,字母由其Unicode以1、2或4字节表示,具体取决于编码UTF8、UTF16/Unicode、UTF32。事实上,字母A存储为数字65。B是66号,以此类推。关键是我们要选择一个终止符,数字0。所以实际上ABC是这样存储的,就像这个十进制:

65 66 67 0
但是如果我们不是用英语写字符串呢。如果我们需要在字符串中间加一个0怎么办:

1 2 3 4 0 1 2 3 4 0
当计算机读取字符串时, 它认为它在中间结束,而不是在0结束。那我们现在该怎么办?在大多数情况下,我们选择选项1。我们传输长度,然后传输字符串本身。你可以这样做,但由于我不想讨论的原因,它不会很好地工作

那么我们如何区分中间的0和最终的空0呢?我们可以选择5来结束这个字符串,直到我们也需要在字符串中加上5,否则不会出错。所以我们做了一些聪明的事情。我们选择一个转义字符:它从字符串读取循环中转义,并使用下一个字符作为指令。基本思路如下:

这个角色是转义角色吗? 对: 抓取下一个角色。 如果下一个字符是: 在字符串中放入转义字符,这样就可以对转义字符进行编码 如果下一个字符是!: 绳子断了! 否则: 错误 不: 转到下一个角色

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

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

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

Bob:Boberty:Bob@bob.com:registered
计算机将自动假定Boberty是电子邮件的真凶。 您需要告诉它如何区分名称中的冒号和字符串结尾的冒号。
转义就是答案。

好的,所以实际上您需要做的只是创建一个小的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 "-";
}
假设我们想对这4行代码进行编码

He:llo
Hell:o
Hello
Hello
所以如果我们忽视逃跑,我们会

He:llo:Hell:o:Hello:Hello
当程序试图将这些分离出来时,我们会

He
llo
Hell
o
Hello
Hello
这肯定不是我们以前投入的。所以我们用逃跑。您可能知道,如果要在字符串中放置a,则必须在其前面放置\。为什么?同样的原因:计算机无法区分中间部分和结束字符串。因此,我们避开了这一引用。想象一下,每当计算机看到一个\时,它就会加入\和下一个字符。所以现在很容易区分这两个引号:

"Hello, My name is "Matt""
vs

看到了吗?现在,了解到\将自身与下一个字符连接起来,将一个斜杠插入的唯一方法是将两个斜杠插入:

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替换为\:,easy:

$retn = str_replace("-","\\-",$retn);
$retn = str_replace(":","\\:",$retn);
更难的是阅读:要阅读,我们必须一次遍历一个字符的字符串,直到到达末尾。所以:每次我们读a\,我们都会忽略下一个字符可能具有的任何特殊含义。否则,我们就把名单分开。让我们来看一看:

List<List<string>> users = new List<List<string>>();
我不会在这里讨论为什么我们应该使用StringBuilder,但它的基本原理是,它在很大程度上提高了程序速度

string bob = "";
bob += "a";
bob += "b";
bob += "c";
所以我们进入了主循环:

while (i<userDB.Length)
{
如果它是一个斜杠,而斜杠没有在它前面,告诉下一个字符在它前面有一个斜杠

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>();
}
如果该字符被转义或不是/,:或-,我们将其添加到当前加载的字符串中,并清除任何转义标志,即告诉下一个字符它前面没有斜杠

希望能把事情弄清楚。正如我所说,JSON无论如何都会为您完成所有这些。但是如果你不明白下面隐藏着什么,你就无法学会如何自己去做

编辑2

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

5 Hello
第二种方法是将字符串存储在内存中,并以null 0结尾。您知道,字母由其Unicode以1、2或4字节表示,具体取决于编码UTF8、UTF16/Unicode、UTF32。事实上,字母A存储为数字65。 B是66号,以此类推。关键是我们要选择一个终止符,数字0。所以实际上ABC是这样存储的,就像这个十进制:

65 66 67 0
但是如果我们不是用英语写字符串呢。如果我们需要在字符串中间加一个0怎么办:

1 2 3 4 0 1 2 3 4 0
当计算机读取字符串时,它认为它在中间结束,而不是在0结束。那我们现在该怎么办?在大多数情况下,我们选择选项1。我们传输长度,然后传输字符串本身。你可以这样做,但由于我不想讨论的原因,它不会很好地工作

那么我们如何区分中间的0和最终的空0呢?我们可以选择5来结束这个字符串,直到我们也需要在字符串中加上5,否则不会出错。所以我们做了一些聪明的事情。我们选择一个转义字符:它从字符串读取循环中转义,并使用下一个字符作为指令。基本思路如下:

这个角色是转义角色吗? 对: 抓取下一个角色。 如果下一个字符是: 在字符串中放入转义字符,这样就可以对转义字符进行编码 如果下一个字符是!: 绳子断了! 否则: 错误 不: 转到下一个角色

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

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

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

Bob:Boberty:Bob@bob.com:registered
计算机将自动假定Boberty是电子邮件的真凶。 您需要告诉它如何区分名称中的冒号和字符串结尾的冒号。
逃跑就是答案。

人们正在做的事情似乎很复杂。 您可以使用一个带有数组列表的循环。 但是首先通过获取MySQL表的表大小将输入添加到数组中,循环该大小并添加以“-”分隔的所有输入。 然后循环遍历它们,并在arraylist中分离它们。 差不多

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;
    }
}
for(int x = 0;x < ArrayList.Size();x++)
{
      String[] Details = x.Split(new char[] { '-' });
      Lists.items.add(Details[0].trim());
}

如果你得到了正确的细节,应该可以很好地工作。我没有简单地用一个输入来完成它。

人们正在做的事情似乎很复杂。 您可以使用一个带有数组列表的循环。 但是首先通过获取MySQL表的表大小将输入添加到数组中,循环该大小并添加以“-”分隔的所有输入。 然后循环遍历它们,并在arraylist中分离它们。 差不多

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;
    }
}
for(int x = 0;x < ArrayList.Size();x++)
{
      String[] Details = x.Split(new char[] { '-' });
      Lists.items.add(Details[0].trim());
}

如果你得到了正确的细节,应该可以很好地工作。我不是简单地用一个输入就完成的。

我有点明白你用SQL做了什么。但是你能告诉我你在用C做什么吗?这让我很困惑,虽然有点容易理解,但这个“转义部分”仍然有点困惑,但这是因为当我看不到其中的逻辑时,很难从php文件的实际主体中学习到一些东西,而且,当我用C读它时,我很难从php文件的实际主体中获取原始字符串,我应该做一些字符串拆分来使用php,然后使用字符串还是有更简单的方法?我已经使用了拆分strinb方法,但这是一种极端的方法。也许JSON是一种方法。你不必在这里处理字符串,但我强烈建议你学习转义是如何工作的,以及为什么我们需要它。我将添加另一个编辑来尝试进一步解释转义。我有点了解您对SQL所做的操作。但是你能告诉我你在用C做什么吗?这让我很困惑,虽然有点容易理解,但这个“转义部分”仍然有点困惑,但这是因为当我看不到其中的逻辑时,很难从php文件的实际主体中学习到一些东西,而且,当我用C读它时,我很难从php文件的实际主体中获取原始字符串,我应该做一些字符串拆分来使用php,然后使用字符串还是有更简单的方法?我已经使用了拆分strinb方法,但这是一种极端的方法。也许JSON是一种方法。你不必在这里处理字符串,但我强烈建议你学习转义是如何工作的,以及为什么我们需要它。我将添加另一个编辑来进一步解释转义。