Ошибка запроса php и sql

У меня есть этот код

http://www.nomorepasting.com/getpaste.php?pasteid=22580

которое является частью небольшого приложения ajax. Я хотел бы знать лучший и более эффективный способ назначить $ query вместо того, чтобы каждый раз копировать sql с другим запросом или кучей предложений if. В основном запрос будет зависеть от нажатой ссылки, но я не уверен, как показать это в логике. Я также не уверен, почему мой SQL-запрос в $ result не работает.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
420
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

ОБНОВИТЬ: Я интегрировал функцию Эрана в отредактированный код. ПРИМЕЧАНИЕ. Я исправил это, передав в него переменную $ table и переименовав ее, поскольку она не выполняет поиск только по тексту запроса, а в основном возвращает необходимые строки!

ОСНОВНЫЕ ОШИБКИ:

  • ошибка 1: вы перезаписываете запрос с помощью query2 во всех случаях, что нарушает код.
  • ошибка 2: LIKE '% $ query%' отсутствует пробел между LIKE и '=> LIKE'% ... это, скорее всего, тоже нарушает ваш код

ДРУГИЕ ВОПРОСЫ

  • проблема безопасности: опасность внедрения sql, используйте mysql_real_escape_string
  • \ n не зависит от платформы: используйте PHP_EOL
  • альтернативный способ написания коротких блоков if
  • используйте фигурные скобки для нормальных структур if и всех подобных структур в этом случае

вот ваш код с некоторыми изменениями, посмотрите комментарии:

<?php
session_start(); //ommit, no session var used

//use braces, always!
//you may write such statements with the short form like
if (isset($_GET['cmd'])) : $cmd = $_GET['cmd']; else : die (_MSG_NO_PARAM); endif;

$query = '';
//escpae your input - very important for security! sql injection!
if ( isset ($_GET["query"]))
{
    $query = mysql_real_escape_string($_GET["query"]);
}
//no need for the other part you had here

$con = mysql_connect("localhost", "root", "geheim");

if (!$con) : die ('Connection failed. Error: '.mysql_error()); endif;

mysql_select_db("ebay", $con);

if ($cmd == "GetRecordSet")
{
    $table = 'Auctions';
    $rows = getRowsByArticleSearch($searchString, $table);

    //use PHP_EOL instead of \n in order to make your script more portable

    echo "<h1>Table: {$table}</h1>".PHP_EOL;
    echo "<table border='1' width='100%'><tr>".PHP_EOL;
    echo "<td width='33%'>Seller ID</td>".PHP_EOL;
    echo "<td width='33%'>Start Date</td>".PHP_EOL;
    echo "<td width='33%'>Description</td>".PHP_EOL;
    echo "</tr>\n";

    // printing table rows
    foreach ($rows as $row)
    {
        $pk = $row['ARTICLE_NO'];
        echo '<tr>'.PHP_EOL;
        echo '<td><a href = "#" onclick = "GetAuctionData(\''.$pk.'\')">'.$row['USERNAME'].'</a></td>'.PHP_EOL;
        echo '<td><a href = "#" onclick = "GetAuctionData(\''.$pk.'\')">'.$row['ACCESSSTARTS'].'</a></td>'.PHP_EOL;
        echo '<td><a href = "#" onclick = "GetAuctionData(\''.$pk.'\')">'.$row['ARTICLE_NAME'].'</a></td>'.PHP_EOL;
        echo '</tr>'.PHP_EOL;
    }
}
mysql_free_result($result);
//mysql_close($con); no need to close connection, you better don't


function getRowsByArticleSearch($searchString, $table) 
{
    $searchString = mysql_real_escape_string($searchString);
    $result = mysql_query("SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM {$table} WHERE upper ARTICLE_NAME LIKE '%" . $searchString . "%'");
    if ($result === false) {
            return mysql_error();
    }
    $rows = array();
    while($row = mysql_fetch_assoc($result)) {
            $rows[] = $row;
    }
    return $rows;
}

// ?> ommit closing php tag

Я собирался это сделать, но убежал. +1 для вас

Kris 09.12.2008 15:11

Нет необходимости в PHP_EOL. Это HTML. Во-первых, разрывы строк не имеют значения. Во-вторых, все программы просмотра исходного кода, которые я видел (кроме Блокнота), работают только с "\ n".

gnud 09.12.2008 15:46

нет проблем с пропуском пробела в "LIKE '% ...%'" - это скобки вокруг имени функции, которые выдают мне ошибку, когда я пробовал ее.

nickf 10.12.2008 02:28

Вы не включили операторы в конструкции IF / THEN / ELSE в знак похвалы, поэтому только первый оператор в каждом блоке выполняется условно, остальные всегда выполняются.

В большинстве случаев вы назначаете $ query2 для $ query, в то время как $ query2, вероятно, не определен.

Еще один совет: дезинфицируйте свой ввод, не вставляйте пользовательский ввод в свой SQL вот так, это опасно.

"SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME
FROM {$table} WHERE upper ARTICLE_NAME LIKE'%$query%'"

Вам нужно заключить в скобки параметры вашей функции upper. измените свой запрос на это, и он должен работать:

"SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME
FROM {$table} WHERE upper(ARTICLE_NAME) LIKE'%$query%'"

для использования функции:

$result = mysql_query($sql_query) or die(mysql_error());

Чтобы узнать, какую ошибку mysql вы получите.

Вам может понадобиться пробел между LIKE и "% $ query%". Также вам следует изучить функцию mysql_error () - пусть MySQL сообщит вам, в чем именно заключается ошибка.

недостающее пространство не вызывает никаких проблем, по крайней мере, когда я его тестировал.

nickf 10.12.2008 02:28

вы должны делать так, как сказал Nickf.

и вы определенно склонны к SQL-инъекции:

викиучебники: http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection длинная статья: http://www.securiteam.com/securityreviews/5DP0N1P76E.html

Вы можете абстрагировать свой запрос в функции, которая принимает текст поиска в качестве параметра. Что-то типа:

function searchQuery($text) {
    $text = mysql_real_escape_string($text);
    $result = mysql_query("SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM {$table} WHERE upper ARTICLE_NAME LIKE '%" . $text . "%'");
    if ($result === false) {
        return mysql_error();
    }
    $rows = array();
    while($row = mysql_fetch_assoc($result)) {
        $rows[] = $row;
    }
    return $rows;
}

Обратите внимание, что вам следует избегать ввода данных пользователем, чтобы предотвратить атаки SQL-инъекций (здесь я использовал для этого mysql_real_escape_string ()). Эта функция также возвращает код ошибки в случае сбоя запроса, поэтому вы должны проверить результат, чтобы узнать, массив это или нет:

 $result = searchQuery($_GET['query']);
 if (!is_array($result) ) {
      echo 'An error has occurred:' . $result;
 } else {
   //iterate over rows
 }

Заключите логические структуры (IF / ELSE) в фигурные скобки {. Это лучше для удобочитаемости и помогает избежать ненужных ошибок.

Другие вопросы по теме