【问题标题】:Inserting and searching data插入和搜索数据
【发布时间】:2012-01-05 18:22:05
【问题描述】:

我有以下数组:

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(主键)、Word、Attestation、Scene、Divinite。因此,每个常规单词都必须进入“单词”字段,其他字段必须填写上面的相应信息。所以前两行应该是这样的:

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

这一切正常。
但是当我想搜索数据时,麻烦就来了。 我写了以下(表称为Words)

mysql_select_db("my_db", $con);
$search = "SELECT Word, Scene, Attestation, Divinite
    FROM Words
    WHERE Word = '$target'  ";

$retval = mysql_query($search, $con);
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo      
     "{$row['Attestation']} <br> ";
}

所以对于 X 字,他会给我证明。所以如果我用'dwA'这个词替换$target,他会给我'DI.2,8' 如果我用“{$row['Divinite']} 替换最后一句“{$row['Attestation']},他会给我'nswt'。等等。

这很好用,但是当我想要替换搜索时

$search = "SELECT Word, Scene, Attestation, Divinite
    FROM Words
    WHERE Word = '$target'  ";

由

  $search = "SELECT Word, Scene, Attestation, Divinite
    FROM Words
    WHERE Scene = '$target'  ";

它不起作用。因此,如果我用 dwA-nTr 替换 $target,他应该给我两次 DI.2,8。 它不适用于 Attestation 或 Divinite。事实上,它只适用于 Word。 我尝试手动插入数据并且它可以工作。所以它似乎不在搜索程序中,而是在数据放入表格的方式中。 有谁知道如何以另一种方式输入数据?这样就可以了

我想我找到了问题,但没有找到解决方案。我用 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。这可能解释了为什么我可以搜索例如单词“dwA”而不是场景 dwA-nTr。但在 dwA-nTr\r 上搜索也不起作用。 但是正如你在 21 中看到的,我手动插入的行,这个 \r 不存在

【问题讨论】:

  • 什么不起作用?你能发布来自数据库的真实数据,而不仅仅是它应该是什么样子吗?
  • 您确认插入的数据正确吗?您是否手动更改了$target 的值?作为插入命令的结果的一些实际数据将是一个很好的开始检查,以及在 SQL 客户端(例如 phpMyAdmin)中手动运行 SQL 命令
  • @Nonym:phpMyAdmin 中的手动搜索也不起作用。如果我手动插入一行,例如 4 - sp(=Word) - DI.8,5(=Attestation) - dwA-nTr(=Scene) - Hr(=Divinite);搜索“dwA-nTr”并询问证明给了我:“DI.8,5”实际上他应该给我所有证明,因为所有行在“场景”字段中都有 dwA-nTr。但他只给了我手动插入的行的“证明”字段。这让我觉得问题与数据的输入有关。如果我手动填写每一行,它会起作用。但是数组太长,无法手动放入
  • 我扩展了数据库的示例,以了解它的外观,但再一次,如果我使用 phpMyAdm 手动插入所有数据,它会起作用,但这当然会需要很长时间

标签: php mysql search input


【解决方案1】:

我还在研究你的帖子,但我们可以从这个开始吗?:

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)可能必须或应该保留在您的数据中。如果是这样,那么我们将改变我们的方法。

现在.. 对单词、场景和证明做同样的事情。然后再次执行搜索..让我知道会发生什么...

【讨论】:

  • :$TextsansBracRenumer 是数组的名称; $InitSceneTitle= ''
  • *word[0] 始终只有一个值:&、@ 或 *。 foreach 确实是在数据库表中插入数据的部分。
  • 这很奇怪.. 你能把当前数据贴在你的表中吗?您当前的逻辑似乎不正确(也就是说..我确实可能遗漏了一些东西)-您检查单词是否以 @ 或 &amp; 开头,但如果都不满足,则检查 @987654330 @ 如果你没有找到 * (忘记其余的,因为它们不在 else if 附件中,然后你插入。这就是我要求样本数据的原因。因为你的 INSERT 命令在foreach,我开始怀疑可能是因为我很遗憾,此时不明白它.. 你能在执行它之前回显$insert 吗?
  • 当一个单词以 & 开头时,它是一个场景,带有 @ 一个 Divinite 和带有 * 一个 Attestation;当程序遇到以其中一个开头的单词时,它将其存储为 $Divinite、$SceneTitle 或 $position;当一个单词不以这些符号之一开头时,它会存储在字段 Word 中,而其他字段则填充存储的信息,因此 $Divinite 进入字段 Divinite,依此类推。当遇到另一个以@、& 或$ 开头的单词时,它会替换前一个单词。这就是在数据库中,在 ID 4 和 5 之间,证明从 DI.2,8 跳转到 DI.2,9。
  • 我缩小了问题的范围。事实上,它的位置比我提出的这个问题要高。制作阵列时会出现问题。原始文本不是连续的文本而是成行的,这意味着该行的最后一个单词后面跟着一个 \r 并且这是(不可见的)添加到数组中的。所以我必须在程序的更高一点上解决这个问题。暂时我关闭这个问题;无论如何感谢您的帮助。
猜你喜欢
  • 2014-02-01
  • 2012-08-06
  • 1970-01-01
  • 2021-08-27
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
相关资源
最近更新 更多