Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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
Php 插入和搜索数据_Php_Mysql_Search_Input - Fatal编程技术网

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)));