У меня есть следующий массив:

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 он даст мне подтверждение. Поэтому, если я заменю $target на слово 'dwA', он даст мне 'DI.2,8'. И если я заменю последнее предложение "{$row['Attestation']} на "{$row['Divinite'] } он даст мне 'nswt'. и так далее.

Это хорошо работает, но когда я хочу, я заменяю поиск

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

От

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

Это не работает. Поэтому, если я заменю $target на dwA-nTr, он должен дважды дать мне 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 отсутствует

0
Preys 24 Ноя 2011 в 19:38
Что не работает? Можешь выложить реальные данные из базы а не только как это должно выглядеть?
 – 
jeroen
24 Ноя 2011 в 20:04
Вы подтвердили правильность введенных данных? Вы вручную меняете значение $target? Некоторые фактические данные в результате ваших команд вставки были бы хорошим началом для проверки, а также ручного запуска ваших команд SQL в вашем клиенте SQL (например, phpMyAdmin)
 – 
Nonym
24 Ноя 2011 в 20:08
@Nonym: ручной поиск в phpMyAdmin тоже не работает. если я вставляю строку вручную, например 4 - sp(=Word) - DI.8,5(=Attestation) - dwA-nTr(=Scene) - Hr(=Divinite); поиск «dwA-nTr» и запрос аттестации дает мне: «DI.8,5» на самом деле он должен дать мне все аттестации, потому что все строки имеют dwA-nTr в поле «Scene». Но он дает мне только поле «Аттестация» строки, которую я вставил вручную. Это заставило меня подумать, что проблема как-то связана с вводом данных. Если я заполню каждую строку вручную, это сработает. Но массив слишком длинный, чтобы вставлять его вручную
 – 
Preys
24 Ноя 2011 в 22:19
Я расширил пример базы данных, чтобы иметь представление, как она выглядит, но еще раз, если бы я вставил все данные вручную с помощью phpMyAdm, это сработало бы, но это, конечно, заняло бы целую вечность.
 – 
Preys
24 Ноя 2011 в 22:28

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) могут остаться или должны остаться в ваших данных. Если это так, то мы изменим наш подход.

А пока... сделайте то же самое для слова, сцены и аттестации. А затем снова выполните поиск.. Дайте мне знать, что произойдет...

0
Nonym 25 Ноя 2011 в 01:56
:$TextsansBracRenumer — имя массива; $InitSceneTitle= ''
 – 
Preys
25 Ноя 2011 в 00:54
*word[0] всегда имеет только одно значение: &, @ или *. foreach действительно является частью, которая вставляет данные в таблицу базы данных.
 – 
Preys
25 Ноя 2011 в 00:57
Это странно.. Можете ли вы опубликовать текущие данные в своей таблице? Ваша текущая логика не кажется правильной (то есть... я мог бы действительно что-то упустить) - вы проверяете, начинается ли слово с @ или &, но если ни один из них не встречается, вы затем проверьте *, и если вы не найдете * (забудьте об остальных, потому что они не находятся в else if корпусах, вы затем вставляете. Вот почему я прошу образцы данных . Поскольку ваша команда INSERT находится внутри foreach, я задался вопросом, может быть, потому, что я, к сожалению, не понимаю ее в настоящее время.. Не могли бы вы повторить $insert также до того, как вы его выполните?
 – 
Nonym
25 Ноя 2011 в 01:12
Когда слово начинается с &, это Сцена, с @ — Божественное, а с * — Свидетельство; когда программа встречает слово, начинающееся с одного из них, она сохраняет его как $Divinite, $SceneTitle или $position; когда слово не начинается с одного из этих знаков, оно сохраняется в поле Word, а другие поля заполняются сохраненной информацией, поэтому $Divinite появляется в поле Divinite и так далее. Когда встречается другое слово, начинающееся с @, & или $, оно заменяет предыдущее. именно так в базе данных между ID 4 и 5 аттестация переходит с DI.2,8 на DI.2,9.
 – 
Preys
25 Ноя 2011 в 01:34
Я сузил проблему. На самом деле он расположен выше, чем я поставил в этом вопросе. проблема возникает при создании массива. Исходный текст представляет собой не непрерывный текст, а строки, что означает, что за последним словом строки следует символ \r, который (невидимо) добавляется в массив. Так что я должен решить проблему немного выше программы. На данный момент я закрываю этот вопрос; Все равно, спасибо за помощь.
 – 
Preys
25 Ноя 2011 в 02:22