У меня есть этот код
http://www.nomorepasting.com/getpaste.php?pasteid=22580
которое является частью небольшого приложения ajax. Я хотел бы знать лучший и более эффективный способ назначить $ query вместо того, чтобы каждый раз копировать sql с другим запросом или кучей предложений if. В основном запрос будет зависеть от нажатой ссылки, но я не уверен, как показать это в логике. Я также не уверен, почему мой SQL-запрос в $ result не работает.






ОБНОВИТЬ: Я интегрировал функцию Эрана в отредактированный код. ПРИМЕЧАНИЕ. Я исправил это, передав в него переменную $ table и переименовав ее, поскольку она не выполняет поиск только по тексту запроса, а в основном возвращает необходимые строки!
ОСНОВНЫЕ ОШИБКИ:
ДРУГИЕ ВОПРОСЫ
вот ваш код с некоторыми изменениями, посмотрите комментарии:
<?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
Нет необходимости в PHP_EOL. Это HTML. Во-первых, разрывы строк не имеют значения. Во-вторых, все программы просмотра исходного кода, которые я видел (кроме Блокнота), работают только с "\ n".
нет проблем с пропуском пробела в "LIKE '% ...%'" - это скобки вокруг имени функции, которые выдают мне ошибку, когда я пробовал ее.
Вы не включили операторы в конструкции 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.
и вы определенно склонны к 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) в фигурные скобки {. Это лучше для удобочитаемости и помогает избежать ненужных ошибок.
Я собирался это сделать, но убежал. +1 для вас