PHP и SQL запрос не удается - PullRequest
0 голосов
/ 09 декабря 2008

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

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

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

Ответы [ 7 ]

3 голосов
/ 09 декабря 2008

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

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

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

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

  • проблема безопасности: опасность внедрения sql, используйте mysql_real_escape_string
  • \ n не зависит от платформы: используйте PHP_EOL
  • альтернативный способ записи коротких блоков 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
2 голосов
/ 09 декабря 2008

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

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) фигурными скобками {. Это лучше для удобочитаемости и помогает избежать ненужных ошибок.

2 голосов
/ 09 декабря 2008

Вы должны сделать, как Никф сказал.

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

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

2 голосов
/ 09 декабря 2008

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

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

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

2 голосов
/ 09 декабря 2008
"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%'"
0 голосов
/ 09 декабря 2008

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

0 голосов
/ 09 декабря 2008

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

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

Как еще один совет: очистите ваш ввод, не вставляйте пользовательский ввод в ваш SQL таким образом, это опасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...