Intereting Posts
предотвращать автоматическое добавление косой черты при использовании parse_str Переименование дубликатов строк в MySQL Поисковое ключевое слово (-ы), которое соответствует данным в MySQL Принимая сумму «столбца» в MongoDB Seting User Agent param в PHP Простой HTML DOM Parser Echo / напечатать jpg-изображение с php, для безопасности? Получить только объявленные методы класса в PHP Печать таблиц с принудительными разрывами страниц Сортировка многомерного массива на основе упорядоченного массива PHP Date diff с разницей Простая система входа с использованием CodeIgniter, возвращающая 404 при входе в систему Преобразование совпадений в верхнем регистре, полужирное, с использованием регулярных выражений Как получить имя константы? Как я могу получить имя класса из статического вызова в расширенном классе PHP? будет ли заголовок PHP () & exit () безопасным завершением сценария перед перенаправлением?

Проблемы с PHP и MySQL

Я работаю в Xcode и имею приложение iOS, которое вы вводите информацию, и приложение подключается к базе данных через файл PHP. При загрузке нет имени, имени или адреса электронной почты. Но по какой-то причине, когда дело доходит до загрузки UITextView количества текста, через UITextView возникает проблема. Он преуспевает, когда нет пунктуации вообще. Но когда есть период или знак вопроса, он не загружается на сервер, он просто терпит неудачу. Но с полем электронной почты нет проблем, когда дело доходит до периодов или даже этого символа @ . Я не владею PHP или MySQL бэкэндом, поэтому я очень смущен. Вот код для файла php:

 if (isset ($_GET["firstName"]) && isset($_GET["lastName"]) && isset($_GET["emailAddress"]) && isset($_GET["deviceType"]) && isset($_GET["problemTextField"]) && isset($_GET["iosVersion"])){ $firstName = $_GET["firstName"]; $lastName = $_GET["lastName"]; $emailAddress = $_GET["emailAddress"]; $deviceType = $_GET["deviceType"]; $problemTextField = $_GET["problemTextField"]; $iosVersion = $_GET["iosVersion"]; } else { $firstName = "User first name"; $lastName = "User last name"; $emailAddress = "User email address"; $deviceType = "User device type"; $problemTextField = "User problem text field"; $iosVersion = "User ios version"; } $con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error()); mysql_select_db($DB_Name,$con) or die(mysql_error()); $sql = "insert into $DB_Table (firstName, lastName, emailAddress, deviceType, problemTextField, iosVersion, Status, Second_Status) values('$firstName','$lastName', '$emailAddress','$deviceType','$problemTextField','$iosVersion', 'Unanswered', 'Answered')"; $res = mysql_query($sql,$con) or die(mysql_error()); mysql_close($con); if ($res) { echo "success"; }else{ echo "failed"; } 

Как я уже сказал, я не владею PHP, поэтому, пожалуйста, будьте добры, когда разбираете мой синтаксис для файла PHP.

EDIT: после целого дня отладки я понял, что если я убираю пробелы между словами, все в порядке. Для этого есть причина? Я не хочу, чтобы нужно было помещать «плюс» между всеми, я знаю, что это неверно.

Вот мой код Xcode:

 NSString *strURL = [NSString stringWithFormat:@"http://www.website.com/phpFile.php?firstName=%@&lastName=%@&emailAddress=%@&deviceType=%@&problemTextField=%@&iosVersion=%@", firstName.text, lastName.text, emailAddress.text, deviceType.text, self.problemTextBox.text, iosVersion.text]; // to execute php code NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]]; // to receive the returend value NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];` 

Несколько замечаний:

  1. Ты сказал:

    Но когда есть период или знак вопроса, он не загружается на сервер, он просто терпит неудачу.

    В вашем вопросе предполагается, что проблема лежит в PHP-коде, но похоже, что вы, возможно, не должны быть процентом, избегая параметров при создании запроса. Примечательно, что многие люди ошибочно используют stringByAddingPercentEscapesUsingEncoding (который будет stringByAddingPercentEscapesUsingEncoding некоторые символы, но не другие). Примечательно, что есть «юридические» символы, которые действительны в URL-адресе, но недействительны в параметре POST / GET, поэтому вам нужно указать те «юридические» символы, которые также должны быть экранированы процентами (например, ? , & , + , и т. д.) в пределах параметра.

    Короче говоря, вы действительно хотите использовать CFURLCreateStringByAddingPercentEscapes , который позволяет вам указать дополнительные символы, которые должны быть экранированы в RFC 3986 . Например, я использовал следующую категорию NSString .

     @implementation NSString (URLEncode) - (NSString *)stringForHTTPRequest { return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, (CFStringRef)@":/?@!$&'()*+,;=", kCFStringEncodingUTF8)); } @end 

    Или используйте фреймворк вроде AFNetworking, который упрощает процесс создания запросов и заботится об этом для вас.

  2. Обратите внимание, что этот PHP-код возвращает простой ответ строки. Вместо этого я бы предложил создать ответ JSON, который упростит код Objective-C для обработки и интерпретации ответа (и сообщит / зарегистрирует ошибку). Например, при использовании процедурной выдачи mysqli:

     <?php // specify that this will return JSON header('Content-type: application/json'); // open database $con = mysqli_connect("localhost","user","password","database"); // Check connection if (mysqli_connect_errno()) { echo json_encode(array("success" => false, "message" => mysqli_connect_error(), "sqlerrno" => mysqli_connect_errno())); exit; } // get the parameters $field1 = mysqli_real_escape_string($con, $_REQUEST["field1"]); $field2 = mysqli_real_escape_string($con, $_REQUEST["field2"]); // perform the insert $sql = "INSERT INTO sometable (field1, field2) VALUES ('{$field1}', '{$field2}')"; if (!mysqli_query($con, $sql)) { $response = array("success" => false, "message" => mysqli_error($con), "sqlerrno" => mysqli_errno($con), "sqlstate" => mysqli_sqlstate($con)); } else { $response = array("success" => true); } echo json_encode($response); mysqli_close($con); ?> 

    Или, если использовать объектно-ориентированный стиль:

     <?php header('Content-type: application/json'); $mysqli = new mysqli("localhost", "user", "password", "database"); // check connection if ($mysqli->connect_errno) { echo json_encode(array("success" => false, "message" => $mysqli->connect_error, "sqlerrno" => $mysqli->connect_errno)); exit(); } // perform the insert $sql = "INSERT INTO sometable (field1, field2) VALUES (?, ?)"; if ($stmt = $mysqli->prepare($sql)) { $stmt->bind_param("ss", $_REQUEST["field1"], $_REQUEST["field2"]); if (!$stmt->execute()) $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate); else $response = array("success" => true); $stmt->close(); } else { $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate); } $mysqli->close(); echo json_encode($response); ?> 

    Таким образом, приложение Objective-C может получить ответ, проанализировать JSON и посмотреть на success чтобы определить, была ли операция успешной или нет, и посмотрите message для message об ошибке, если оно не было успешным. Это просто позволяет более надежную беседу между приложением и сервером.

  3. Кстати, я бы предположил, что вы используете mysqli_real_escape_string или вручную привязываете параметры к подготовленному оператору для защиты от атак SQL-инъекций или непреднамеренных ошибок, возникающих из неэкранированных строк в вашем SQL.

  4. Я также предлагаю вам создать запрос POST а не запрос GET который позволяет использовать большие значения.

Во-первых, не используйте функции mysql_ *, они устарели и скоро будут удалены из php. Проверьте mysqli или PDO для замены.

Когда вы разговариваете с базой данных, важно, чтобы вход был проверен, поэтому неплохо.
Вы можете сделать это с помощью управляющих функций или предварительно подготовленных операторов.
Оба mysqli и pdo подготовили заявления.
Подготовленные операторы помогут вам ускользнуть, поскольку вы даете оболочке mysql знать, какой тип данных он должен ожидать, давая ему что-нибудь еще, вызывая ошибку.

Ваш код очень открыт для чего-то, называемого SQL Injections ( http://en.wikipedia.org/wiki/SQL_injection ), и это плохо.
Вероятно, поэтому ваш запрос разбивается на определенные символы.
Подготовленные заявления помогают предотвратить это!

Пожалуйста, прочитайте документацию mysqli и, в частности, подготовленные инструкции mysqli:
http://php.net/manual/en/book.mysqli.php
http://php.net/manual/en/mysqli.prepare.php

Я рекомендую Mysqli из-за того, что он больше похож на mysql api, чем PDO.
Но PDO может быть лучше, если вы не возражаете узнать что-то новое!

Кроме того, как упоминает ddelnado, GET может быть не оптимальным для этого, POST может быть лучше подходит.

используйте mysql_real_escape_string как

  $firstName = mysql_real_escape_string($_GET["firstName"]); 

прежде чем все получить значения

благодаря

Вы не должны использовать суперглобальный $ _GET. Метод Get имеет ограничение на размер данных, когда суперглобальное значение $ _POST не имеет предела. Таким образом, ваш код должен выглядеть так. \

 if (isset ($_POST["firstName"]) && isset($_POST["lastName"]) && isset($_POST["emailAddress"]) && isset($_POST["deviceType"]) && isset($_POST["problemTextField"]) && isset($_POST["iosVersion"])){ $firstName = $_POST["firstName"]; $lastName = $_POST["lastName"]; $emailAddress = $_POST["emailAddress"]; $deviceType = $_POST["deviceType"]; $problemTextField = $_POST["problemTextField"]; $iosVersion = $_POST["iosVersion"]; 

Я не знаю, какую форму вы используете для отправки, но метод этой формы также должен быть опубликован. Кроме того, вы всегда должны избегать переменных, прежде чем вставлять их в базу данных, поэтому SQL-инъекция не возникает.