Не могу заставить мой SQL делать то, что я хочу. Хочу, чтобы он возвращал data новые данные после заданного идентификатора

#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, как правило, упрощает отладку сообщений об ошибках, если в вашем запросе тоже есть разрывы строк.