#php #mysql
#php #mysql
Вопрос:
Я просто хочу передать идентификационный номер (первичный ключ) и получить обратно все записи, которые были добавлены с этого идентификатора. Идентификатор увеличивается для каждой записи, поэтому это должен быть безопасный способ получения новых записей для клиента.
Но я получаю строку ошибки обратно моему клиенту
18Error retrieving scores You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id>18 ORDER BY id ASC LIMIT 0,100' at line 1
Я возился с изменением способа его выполнения и изменением запроса, так что теперь это может быть действительно запутано. Но в любом случае мой код следует:
$table = "highscores";
// Initialization
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
mysql_select_db(DB_NAME, $conn);
// Error checking
if(!$conn) {
die('Could not connect ' . mysql_error());
}
$type = isset($_GET['type']) ? $_GET['type'] : "global";
$offset = isset($_GET['offset']) ? $_GET['offset'] : "0";
$count = isset($_GET['count']) ? $_GET['count'] : "100";
$sort = isset($_GET['sort']) ? $_GET['sort'] : "id ASC";
// Localize the GET variables
$udid = isset($_GET['udid']) ? $_GET['udid'] : "";
$name = isset($_GET['name']) ? $_GET['name'] : "";
$clubname = isset($_GET['clubname']) ? $_GET['clubname'] : "";
$theid = isset($_GET['theid']) ? $_GET['theid'] : "";
// Protect against sql injections
$type = mysql_real_escape_string($type);
$offset = mysql_real_escape_string($offset);
$count = mysql_real_escape_string($count);
$sort = mysql_real_escape_string($sort);
$udid = mysql_real_escape_string($udid);
$name = mysql_real_escape_string($name);
$clubname = mysql_real_escape_string($clubname);
$theid = mysql_real_escape_string($theid);
echo $theid;
// Build the sql query
$sql = "SELECT * FROM $table WHERE ";
//$sql = "SELECT * FROM $table WHERE id>$theid ";
switch($type) {
case "global":
$sql .= "1 ";
break;
case "device":
$sql .= "udid = '$udid' ";
break;
case "name":
$sql .= "name = '$name' ";
break;
case "clubname":
$sql .= "clubname = '$clubname' ";
break;
}
$sql .= "id>$theid ";
$sql .= "ORDER BY $sort ";
$sql .= "LIMIT $offset,$count ";
$result = mysql_query($sql,$conn);
if(!$result) {
die("Error retrieving scores " . mysql_error());
}
//echo $resu<
$rows = array();
while($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}
mysql_free_result($result);
mysql_close($conn);
echo json_encode($rows);
Кто-нибудь может направить меня на правильный путь, чтобы заставить это работать, пожалуйста?
Большое спасибо, -Code
Комментарии:
1. Какова результирующая строка SQL-запроса? т. Е. Что вы получаете, когда вы
echo $sql
?2. Каков точный запрос? (Например, что
$sql
содержится, когда ваш код достигаетdie()
инструкции?)3. Если какой-либо из этих случаев в вашем switch совпадает, то в конечном итоге вы получите недопустимый sql, поскольку нет логического оператора (и / или), соединяющего логику, вызванную switch (), и always-there
id>$theid
.4. Спасибо, ребята, я ценю совет.
Ответ №1:
У вас всегда будет 2 условия в вашем предложении where, но между ними отсутствует OR или И… Для одного из возможных путей через код это то, что предлагается серверу:
SELECT * FROM $table
WHERE udid = '$udid' id>$theid ORDER BY $sort LIMIT $offset,$count
но это должно быть что-то вроде
SELECT * FROM $table
WHERE udid = '$udid' AND id>$theid ORDER BY $sort LIMIT $offset,$count
Но в качестве общего замечания предложения Оли и Арджана — отличный совет, простой
echo $sql
может быть очень поучительным.
Комментарии:
1. 1. Что касается исходного poster, хорошей идеей было бы получить весь запрос и отправить его непосредственно на сервер для тестирования. MySQL, как правило, упрощает отладку сообщений об ошибках, если в вашем запросе тоже есть разрывы строк.