У меня есть приложение для 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);
}
В выводе исключения 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)
Других решений пока нет …