Передача массива идентификаторов из Swift URLSession в PHP для SQL-запроса?

У меня есть приложение для iOS, которое имеет массив идентификаторов. Эти идентификаторы являются номерами:

var ids = [Int]() //Id array in my TableView
ids = basketStruct.getAllIds() //Pulling the array of ID's from my basket model.
print("This is how PHP sees the POST") //Debugging purposes
print(self.ids)
print("This is how PHP sees the POST")
basketServer.ids = self.ids //Passing the ID's to my URLSession.

URLSession обрабатывает массив следующим образом:

var ids = [Int]()
func downloadItems() {
request.httpMethod = "POST"let postParameters = "ids="+String(describing: ids)
}

Я воздержался от публикации сообщений о классе URLSession, поскольку это, вероятно, не нужно.

Теперь моя консоль XCode выглядит следующим образом:

This is how PHP sees the POST
[1,5,7,8]
This is how PHP sees the POST
Data downloaded
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value.}

Я не получил никаких результатов. Однако, если я изменю все свои массивы идентификаторов на тип NSArray и запустлюсь, я получу возвращенные результаты, если мой массив содержит только 1 идентификатор. Когда я добавляю более 1 идентификатора в массив, я получаю ту же ошибку.

Теперь, на моем php, если я изменю все на GET, а не POST и напрямую введу некоторые значения в моей строке URL и перейду на страницу в браузере, все будет работать как надо. Я получаю хороший ответ в формате JSON со всеми идентификаторами, перечисленными в моей панели URL.

Если я верну все обратно на POST, а затем получу доступ к файлам журнала ошибок apache после попытки запустить мое приложение, они скажут следующее:

[Thu Feb 22 20:51:42.873663 2018] [:error] [pid 18793] [client 192.168.1.46:60790] PHP Fatal error:  Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 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 '[1])' at line 1 in /var/www/api/DbOperation.php:92\nStack trace:\n#0 /var/www/api/DbOperation.php(92): PDO->prepare('SELECT * FROM `...')\n#1 /var/www/api/Basket.php(14): DbOperation->basket('[1, 5, 7, 8]')\n#2 {main}\n  thrown in /var/www/api/DbOperation.php on line 92

Я знаю, что эта проблема широка и состоит из многих частей, но я застрял 🙁 Любая помощь будет высоко ценится.

Спасибо

П.С. — Если кто-нибудь захочет это увидеть, вот мой PHP-код:

Это страница PHP, в которую входит и моя URLSession:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
require_once dirname(__FILE__) . '/DbOperation.php';

$ids = $_POST["ids"];

$db = new DbOperation();
$json = $db->basket($ids);

}

Вот DbOperation:

    public function basket($ids) {
require dirname(__FILE__) .  '/../../dbconnect.php';
$sql = "SELECT * FROM `Menu` WHERE `ID` IN ($ids)";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
echo json_encode($result);
}

0

Решение

В выводе исключения PHP вы можете видеть, что функция basket вызывается с такой строкой:

DbOperation->basket('[1, 5, 7, 8]')

Поэтому код PHP будет генерировать этот SQL:

$sql = "SELECT * FROM `Menu` WHERE `ID` IN ($ids)";

Который:

SELECT * FROM `Menu` WHERE `ID` IN ([1, 5, 7, 8])

Это не допустимый SQL.

Вы можете сделать это, преобразовав строку $ ids в формат, который будет работать в SQL.

// Remove '[' and ']' characters
$inValues = str_replace(['[',']'], '', $ids);
$sql = "SELECT * FROM `Menu` WHERE `ID` IN ($inValues)";

Теперь вы получите:

SELECT * FROM `Menu` WHERE `ID` IN (1, 5, 7, 8)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]