У меня есть проблема на Xcode 8.
В PHP я использую PHPMailer для отправки электронной почты. мой код PHP, как показано ниже.
send.php
<?php
require 'database/connect.php';
global $connect;
date_default_timezone_set('Etc/UTC');
require 'PHPMailer-master2/PHPMailerAutoload.php';
if ( isset($_POST['data1']) && isset($_POST['data2']))
{
$data1 = $_POST['data1'];
$data2 = $_POST['data2'];
$sql = "SELECT * FROM table WHERE data1 = '$data1' AND data2='$data2'";
$result = mysqli_query($connect, $sql);
if ($result && mysqli_num_rows($result) > 0)
{
while ($row = mysqli_fetch_array($result)){
}
$output = array('message' => '1');
echo json_encode($output);
$add = "INSERT INTO table (data1, data2)
VALUES ('$data1','$data2')
";
$run = mysqli_query($connect,$add);
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'gmail.com';
$mail->Password = '******';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('[email protected]', 'sender');
$mail->addAddress('[email protected]','receiver');
$mail->isHTML(true);
$mail->Subject = 'Test';
$mail->Body = 'Test';
$mail->AltBody = 'Test';
if(!$mail->send()) {
echo json_encode([
'status' => false,
'message' => 'Message could not be sent. Error: ' . $mail->ErrorInfo
]);
} else {
$status = array();
$status[] = array('status' => '1');
}
$output = array('message' => '1', 'status' => $status);
echo json_encode($output);
exit();
// End sending email
exit();
mysqli_free_result($result);
}
else {}
}
?>
Мне удалось отправить данные на сервер и отправить электронное письмо получателю, используя приведенный выше код.
Единственная проблема, с которой я сталкиваюсь сейчас — это xcode. Это говорит:
Ошибка разбора: данные не могут быть прочитаны, потому что они не в правильном
формат.
Xcode не может прочитать мой код PHPMailer в файле PHP, из-за чего мой код swift 3.0 выполняет Ловить заявление вместо сообщение == ‘1’ заявление. Мой быстрый код, как показано ниже.
post.swift
@IBAction func sendApplyMovement(_ sender: Any) {
let url = URL(string: "http://localhost/send.php")
let session = URLSession.shared
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"let valueToSend = "data1=&data2"request.httpBody = valueToSend.data(using: String.Encoding.utf8)
let myAlert = UIAlertController(title: "Confirm", message: "Sure ?", preferredStyle: UIAlertControllerStyle.alert)
let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default, handler: nil)
let okaction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler:
{
action in
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
if error != nil {
return
}
else {
do {
if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String]
{
DispatchQueue.main.async {
let message = Int(json["message"]!)
let status = Int(json["status"]!)
if(message == 1){
if(status == 1){
print("Success")
let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let navigationController = UINavigationController.init(rootViewController: myViewController)
appDelegate.window?.rootViewController = navigationController
appDelegate.window?.makeKeyAndVisible()
let myAlert = UIAlertController(title: "Success!", message: "Sent !", preferredStyle: UIAlertControllerStyle.alert)
myAlert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.default, handler: nil))
navigationController.present(myAlert, animated: true, completion: nil)
return
}
}
else {return}
}
}
}
catch let parseError { print("Parse error: \(parseError.localizedDescription)") }
}
})
task.resume()
}
)
myAlert.addAction(okaction)
myAlert.addAction(cancel)
self.present(myAlert, animated: true, completion: nil)
}
}
Есть ли что-то, что мне нужно изменить, чтобы это работало?
Вы делаете это:
if let json = try JSONSerialization.jsonObject(with: data!)
Это означает, что данные, которые вы получаете, находятся в формате JSON, но ваш код PHPMailer делает это:
if(!$mail->send())
{
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
}
else
{
echo 'Message has been sent';
}
который не возвращает код JSON, поэтому я не удивлен, что у вас возникли проблемы с его анализом. Вы уже публиковали этот вопрос, но он был очень неясным — вы говорили, что Xcode не может открыть ваш файл PHP, а не то, что вы не можете разобрать ответ; это ошибка во время выполнения Swift, а не ошибка XCode.
Верните свой ответ в формате JSON, и вы можете добиться большего успеха, например:
if(!$mail->send()) {
echo json_encode([
'status' => false,
'message' => 'Message could not be sent. Error: ' . $mail->ErrorInfo
]);
} else {
echo json_encode([
'status' => true,
'message' => 'Message sent'
]);
}
Других решений пока нет …