Php 插入和搜索数据
我有以下数组:Php 插入和搜索数据,php,mysql,search,input,Php,Mysql,Search,Input,我有以下数组: Array ( [0] => &dwA-nTr& [1] => @nswt@ [2] => *DI.2,8* [3] => dwA [4] => nTr [5] => sp [6] => fdw [7] => @jHj@ [8] => *DI.2,9* [9] => jHj [10] => wr
Array
(
[0] => &dwA-nTr&
[1] => @nswt@
[2] => *DI.2,8*
[3] => dwA
[4] => nTr
[5] => sp
[6] => fdw
[7] => @jHj@
[8] => *DI.2,9*
[9] => jHj
[10] => wr
[11] => sA
[12] => Hw,t-Hrw
[13] => jrj
[14] => sSS,t
[15] => n
[16] => mw,t
[17] => =f
[18] => wsr,t
[19] => @nswt@
[20] => *DI.2,10*
[21] => nswt-bj,t.j
目标是将此数据插入mysql表中。以“&”开头的每个单词都是一个场景;以“@”开头是一个神祗,以“*”开头是一个证明。其他单词是常规单词。该表有5个字段:ID(主键)、字、证明、场景、占卜。因此,每个常规单词都必须放在“单词”字段中,而其他字段则必须填入上面相应的信息。因此,前两行应该如下所示:
ID Word Attestation Scene Divinite
1 dwA DI.2,8 dwA-nTr nswt
2 nTr DI.2,8 dwA-nTr nswt
3 sp DI.2,8 dwA-nTr nswt
4 fdw DI.2,8 dwA-nTr nswt
5 jHj DI.2,9 dwA-nTr jHj
6 wr DI.2,9 dwA-nTr jHj
7 sA DI.2,9 dwA-nTr jHj
8 Hw,t-Hrw DI.2,9 dwA-nTr jHj
9 jrj DI.2,9 dwA-nTr jHj
10 sSS,t DI.2,9 dwA-nTr jHj
11 n DI.2,9 dwA-nTr jHj
12 mw,t DI.2,9 dwA-nTr jHj
13 =f DI.2,9 dwA-nTr jHj
14 wsr,t DI.2,9 dwA-nTr jHj
15 nswt-bj,t.j DI.2,10 dwA-nTr nswt
为此,我写了以下内容:
mysql_select_db("my_db", $con);
$SceneTitle = $InitSceneTitle;
foreach($TextsansBracRenumer as $word)
{
if ($word[0] === "@")
{
$Divinite = str_replace("@", "", $word);
}
if ($word[0] === "&")
{
$SceneTitle = str_replace("&", "", $word);
}
if ($word[0] === "*")
{
$position = str_replace("*", "", $word);
}
else
{
$SceneInfo = $position;
$insert="INSERT INTO Words (Word, Attestation, Scene, Divinite) VALUES ('$word', '$position', '$SceneTitle', '$Divinite')";
mysql_query($insert) OR die(mysql_error());
}
这很好用。但当我想搜索数据时,麻烦就开始了。 我写了以下(表格称为单词) 借 它不起作用。因此,如果我用dwA nTr替换$target,他应该给我两次DI.2,8。 它不适用于认证或占卜。事实上,它只适用于文字。 我试着手动插入数据,然后就可以了。因此,它似乎不在搜索程序中,而是在数据放入表格的方式中。 有人知道如何以另一种方式输入数据吗?这样就行了 我想我找到了问题,但没有找到解决办法。我用SQL导出了数据库,结果如下:
CREATE TABLE `Words` (
`ID` mediumint(15) NOT NULL AUTO_INCREMENT,
`Word` varchar(15) NOT NULL,
`Attestation` varchar(15) NOT NULL,
`Scene` varchar(15) NOT NULL,
`Divinite` varchar(15) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
--
-- Dumping data for table `Words`
--
INSERT INTO `Words` VALUES(3, 'dwA', 'DI.2,8\r', 'dwA-nTr\r', 'nswt\r');
INSERT INTO `Words` VALUES(4, 'nTr', 'DI.2,8\r', 'dwA-nTr\r', 'nswt\r');
INSERT INTO `Words` VALUES(5, 'sp', 'DI.2,8\r', 'dwA-nTr\r', 'nswt\r');
INSERT INTO `Words` VALUES(6, 'fdw\r', 'DI.2,8\r', 'dwA-nTr\r', 'nswt\r');
INSERT INTO `Words` VALUES(8, 'jHj', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(9, 'wr', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(10, 'sA', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(11, 'Hw,t-Hrw', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(12, 'jrj', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(13, 'sSS,t', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(14, 'n', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(15, 'mw,t', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(16, '=f', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(17, 'wsr,t\r', 'DI.2,9\r', 'dwA-nTr\r', 'jHj\r');
INSERT INTO `Words` VALUES(19, 'nswt-bj,t.j', 'DI.2,10\r', 'dwA-nTr\r', 'nswt\r');
INSERT INTO `Words` VALUES(21, 'Hnk', 'DI.9,8', 'Hnk-wnHr', 'jHj');
正如您在每次“见证”之后看到的那样,“场景”和“占卜者”都会出现\r\n。这很可能解释了为什么我可以搜索单词“dwA”,但不能搜索场景dwA nTr。但是在dwA nTr上搜索\r也不起作用。
但正如您在21中所看到的,我手动插入的那一行,这个\r不存在我仍在研究您的帖子,但我们可以从这个开始吗?:
foreach($TextsansBracRenumer as $word)
{ # changed to else..if since $word[0] is only one value, right? let me know
if ($word[0] === "@")
{
$Divinite = str_replace("@", "", $word);
}
else if ($word[0] === "&")
{
$SceneTitle = str_replace("&", "", $word);
}
else if ($word[0] === "*")
{
$position = str_replace("*", "", $word);
}
}
# just imagining pulling this out of your code, assuming that the foreach above handled the word-processing
$SceneInfo = $position;
$insert="INSERT INTO Words (Word, Attestation, Scene, Divinite) VALUES ('$word', '$position', '$SceneTitle', '$Divinite')";
mysql_query($insert) OR die(mysql_error());
我想要更多的代码,比如:
$InitSceneTitle
的值是多少?
$TextsansBracRenumer
的值是多少
[编辑][基于新信息:插入的行数据]
尝试替换此:
$Divinite = str_replace("@", "", $word);
为此:
$Divinite = str_replace("\n",'', str_replace("\r",'', str_replace("@", "", $word)));
数组中的数据似乎包含新行和回车字符,分别由\n
和\r
表示。。你得换掉那些。这件事揭示的是。。。数组如何填充数据?因为如果我们不小心,那么这两个(\n和\r)可能必须或应该保留在您的数据中。如果是这样,那么我们将改变我们的方法
现在。。对单词、场景和证明也要这样做。然后再次执行搜索。。让我知道发生了什么…什么不起作用?你能从数据库中发布真实的数据,而不仅仅是它应该是什么样子吗?你确认插入它的数据是正确的吗?是否手动更改
$target
的值?insert命令产生的一些实际数据将是检查的良好开端,也可以在SQL客户机(例如phpMyAdmin)中手动运行SQL命令@Nonym:phpMyAdmin中的手动搜索也不起作用。如果我手动插入一行,例如4-sp(=单词)-DI.8,5(=认证)-dwA nTr(=场景)-Hr(=Divinite);搜索“dwA nTr”并要求证明给了我:“DI.8,5”事实上,他应该给我所有的证明,因为字段“场景”中的所有行都有dwA nTr。但他只给了我手动插入的行的字段“证明”。这使我认为问题与数据的输入有关。如果我手动填写每一行,就行了。但是数组太长,无法放入manualyI扩展了数据库的示例,以便了解它的外观,但是再次说明,如果我使用phpMyAdm手动插入所有数据,那么它会正常工作,但这当然需要很长时间:$TextsansBracRenumer是数组的名称$InitSceneTitle=''*字[0]始终只有一个值:&、@或*。foreach实际上是在数据库表中插入数据的部分。这很奇怪。。您能在表中发布当前数据吗?您当前的逻辑似乎不正确(即..我可能确实遗漏了一些东西)--您检查单词是否以@
或&
开头,但如果这些都不满足,则检查*
,如果找不到*
(忘记其余的,因为它们不在中,否则如果
附件中,则插入。这就是我要求提供示例数据的原因。因为您的插入
命令在foreach
中,我开始怀疑可能是因为我现在不理解它。在执行之前,您是否也可以回显$insert
它?当一个单词以&它是一个场景,以@a Divinite和*一个证明开头;当程序遇到以其中一个开头的单词时,它将其存储为$Divinite、$SceneTitle或$position;当一个单词不以其中一个符号开头时,它将存储在字段word中,其他字段将填充存储的信息因此,$Divinite出现在Divinite字段中,以此类推。当遇到另一个以@、&或$开头的单词时,它会替换上一个。这就是在数据库中,ID 4和5之间,证明从DI.2,8跳到DI.2,9。我缩小了问题的范围。事实上,它的位置比我在这个问题中输入的位置更高。问题是创建数组时为es。原始文本不是连续文本,而是成行的,这意味着该行的最后一个字后面跟着一个\r,这是(不可见的)添加到数组中的。因此,我必须在程序的更高层解决该问题。现在我关闭此问题;无论如何,感谢您的帮助。
foreach($TextsansBracRenumer as $word)
{ # changed to else..if since $word[0] is only one value, right? let me know
if ($word[0] === "@")
{
$Divinite = str_replace("@", "", $word);
}
else if ($word[0] === "&")
{
$SceneTitle = str_replace("&", "", $word);
}
else if ($word[0] === "*")
{
$position = str_replace("*", "", $word);
}
}
# just imagining pulling this out of your code, assuming that the foreach above handled the word-processing
$SceneInfo = $position;
$insert="INSERT INTO Words (Word, Attestation, Scene, Divinite) VALUES ('$word', '$position', '$SceneTitle', '$Divinite')";
mysql_query($insert) OR die(mysql_error());
$Divinite = str_replace("@", "", $word);
$Divinite = str_replace("\n",'', str_replace("\r",'', str_replace("@", "", $word)));