Необычная проблема с PHP / MYSQL — имена отключаются

#php #url

#php #url

Вопрос:

Для определенных продуктов в моей базе данных название продукта будет обрезано между <a href=" RIGHT HERE "> </a>

Он будет корректно отображаться с помощью визуальной стороны HTML. Но ссылка иногда отображает сокращенное имя.

У кого-нибудь есть идеи, почему это может быть?

Кажется, я даже не могу подумать, в чем может быть проблема?

             $result = mysql_query($query);
            while($row = mysql_fetch_row($result))
                {


        $namelink = str_replace(" ","_",$row[1]);



print <<< PRODUCT_RESULTS
    <table  cellpadding="5" cellspacing="5" id="vProducts">
        <tr>
                <td><img src="$row[3]"/></td>
                <td id="productTitle"><a href="/view_product1.php?name=$namelinkamp;model=$row[0]">$row[1]</a><br />
                <li>Model: $row[0]</li>
                </td>
        </tr>
    </table>
    <div style="width:749px; height:1px; background:#CCC;"></div>

PRODUCT_RESULTS;
}
  

Структура таблицы:

    CREATE TABLE `products` (
  `modelNumber` varchar(100) NOT NULL DEFAULT '',
  `name` varchar(400) DEFAULT NULL,
  `shortDescription` varchar(500) DEFAULT NULL,
  `image` varchar(400) DEFAULT NULL,
  `largeImage` varchar(400) DEFAULT NULL,
  `url` varchar(400) DEFAULT NULL
  )
  

Комментарии:

1. Некоторый код и структура таблицы были бы хороши

2. Это 2011 год? Расширение mysql вышло из моды полдесятилетия назад, используйте mysqli или PDO, оба имеют подготовленные инструкции, и поэтому вы можете избежать атак с использованием SQL-инъекций. Использование $row [1] гарантирует место в конкурсе на обфускацию — используйте имена столбцов для удобства чтения. Наконец, сброс подобных данных без перехода в HTML также является особенно хорошей идеей.

3. @chx Спасибо за ваш совет. Программируя совсем недолго, я все еще изучаю игру.

4. Возможно ли, что в ваших именах есть специальные символы, которые нужно экранировать с помощью urlencode() , прежде чем помещать их в URL? Просмотр выходного исходного кода также был бы полезен.

5. @chx Послушай, я не говорю, что считаю это хорошей идеей. Черт возьми, это откровенно раздражает, но я сталкивался со случаями, когда PHP 5 был доступен, но только с базовой функциональностью MySQL. Лично меня активно беспокоит то, что я единственный в своей компании, кто настаивает на PDO для PHP 5.x…

Ответ №1:

Это может показаться сумасшедшим, но есть ли у вас > , " или какой-либо другой символ, который сделал бы недопустимым HTML в этой записи? Что происходит, когда вы используете «просмотр исходного кода»? Он все еще отключен?

Кстати, я не знаю, осознаете ли вы это, но вы выполняете двойной поиск по этим переменным. Это не только медленнее, но и сложнее в отладке. Вместо того, чтобы делать это:

              <td id="productTitle">
                  <a href="/view_product1.php?name=$namelinkamp;model=$row[0]">
                      $row[1]
                  </a>
                  <br />
                  <li>Model: $row[0]</li>
  

Установите переменные перед печатью, эквивалентной каждому из индексов массива, а затем выведите этот результат.

Вы также могли бы избавиться от вызова print и просто использовать ?> <?php . Очевидно, что вам нужно будет вывести содержимое переменных вручную, как только вы это сделаете, но это, возможно, было бы чище и понятнее.

Комментарии:

1. Причина, по которой здесь используются числовые индексы, заключается в том, что OP использовал числовые индексы.

Ответ №2:

Измените $row[3] на $row[image] и $row[0] на $row[modelNumber] и т.д. И если это не сработает, мне нужно будет просмотреть запрос $ .

Редактировать: Krinkle (комментарий ниже) предлагает использовать $row["image"] и $row["modelNumber"] , что является лучшей практикой.

Комментарии:

1. Не меняйте их на $row[image] , но на $row["image"] (обратите внимание на кавычки), иначе вы будете ссылаться на глобальные константы.

2. Спасибо за ваш комментарий, и да, использование кавычек — более правильная практика, как в $row["image"] , но я почти уверен, что $row[image] будет функционировать без проблем (хотя и выдаст уведомление), если оно не используется в качестве константы.