2015-04-23 1 views
0

Я пытаюсь вставить данные в две таблицы базы данных с Android через скрипт PHP. Мне удалось загрузить что-то из базы данных, поэтому разрешения и база данных выглядят нормально, но этот код не работает, хотя я думаю, что я точно следил за тем, что представлено в некоторых примерах.Невозможно вставить данные на удаленный сервер MySQL через PHP-скрипт с Android

Эти таблицы:

CREATE TABLE `sales` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `order_date` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `status` enum('Waiting', 'Accepted', 'Production','Transport', 'Finalised', 'Canceled') NOT NULL DEFAULT 'Waiting', 
    `user_id` varchar(16) NOT NULL, 
    `pizza_id` int(11) NOT NULL, 
    `pizza_size` tinyint(4) unsigned NOT NULL, 
    `income` decimal(10,2) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    KEY `pizza_id` (`pizza_id`), 
    CONSTRAINT `sales_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`login`) ON UPDATE CASCADE, 
    CONSTRAINT `sales_ibfk_2` FOREIGN KEY (`pizza_id`) REFERENCES `pizzas` (`id`) ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 

CREATE TABLE `deliveries` (
    `order_id` int(11) NOT NULL, //sale id actually 
    `adress` varchar(50) NOT NULL, 
    `client_name` varchar(35) DEFAULT NULL, 
    `telephone` varchar(20) DEFAULT NULL, 
    `cost` decimal(10,2) NOT NULL DEFAULT '0.00', 
    UNIQUE KEY `order_id` (`order_id`), 
    CONSTRAINT `delivery_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `sales` (`id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Это .php сценарий, который я написал, чтобы вставить данные в этих таблицах:

<?php 
mysql_connect("www.db4free.net","user","password") or die(mysql_error()); 
mysql_select_db("database"); 

$user = $_POST['user']; 
$pizzaID = $_POST['pizzaID']; 
$pizzaSize = $_POST['pizzaSize']; 
$income = $_POST['income']; 
$address = $_POST['address']; 
$clientName = $_POST['clientName']; 
$telephone = $_POST['telephone']; 

$time = time();     //I want to pass current timestamp 
$SQLInsertSale = "INSERT INTO sales VALUES(Null, '{$time}', 'Waiting', '{$user}', '{$pizzaID}', '{$pizzaSize}', '{$income}');"; 
$someResult = mysql_query($SQLInsertSale); 

$SQLLastID = "SELECT LAST_INSERT_ID() AS id;"; 
$result = mysql_query($SQLLastID); 
$row = mysql_fetch_assoc($result); 
$lastID = $row['id']; 


$SQLInsertDelivery = "INSERT INTO deliveries VALUES('{$lastID}', '{$address}', '{$clientName}', '{$telephone}', 0.0);"; 
$someResult = mysql_query($SQLInsertDelivery); 

mysql_close(); 
?> 

и, наконец, это код, я бегу на андроид (Я называю этот метод внутри doInBackground метода AsyncTask):

public static void sendData(String user, int pizzaID, int pizzaSize, double income, 
         String address, String clientName, String telephone){ 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://www.myservice.byethost33.com/insertOrder.php"); 

     try { 
      // Add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(7); 
      nameValuePairs.add(new BasicNameValuePair("user", user)); 
      nameValuePairs.add(new BasicNameValuePair("pizzaID", String.valueOf(pizzaID))); 
      nameValuePairs.add(new BasicNameValuePair("pizzaSize", String.valueOf(pizzaSize))); 
      nameValuePairs.add(new BasicNameValuePair("income", String.valueOf(income))); 
      nameValuePairs.add(new BasicNameValuePair("address", address)); 
      nameValuePairs.add(new BasicNameValuePair("clientName", clientName)); 
      nameValuePairs.add(new BasicNameValuePair("telephone", telephone)); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Я новичок в android и php, но скажите, если что-то непонятно, и я попытаюсь объяснить.

+0

Вы пробовали вызов сценарий PHP вне андроида? Каков результат? Вы получили сообщение об ошибке? –

+0

@DidierL no Я не пытался, к сожалению, не знаю, как это сделать ... – Tomasz

+1

Вы не проверяете возвращаемые значения ваших вызовов на 'mysql _ *()' для ошибок, поэтому, если что-то пошло не так вы не узнаете об этом; вы используете устаревший API - используйте 'mysqli _ *()' или 'PDO'; вы вообще не дезинфицируете свои входы, поэтому вы уязвимы для SQL-инъекций; и любой ввод, содержащий одну цитату, нарушит ваши запросы 'INSERT'. –

ответ

0

Оказалось, что это был простой вопрос с языком php, и я пропустил неправильную вещь в поле timestamp. Я должен использовать now().

$SQLInsertSale = "INSERT INTO sales VALUES(Null, now(), 'Waiting', '$user', '$pizzaID', '$pizzaSize', '$income');"; 
$someResult = mysql_query($SQLInsertSale); 

EDIT: Как я узнал немного больше о PHP, я начал использовать PDO соединение, как вы, ребята предложили (с дезинфицирующим и некоторые обработки ошибок):

<?php 
$connection = new PDO('mysql:host=db4free.net; dbname=database; charset=utf8', 'user', 'password'); 
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

$user = $_REQUEST['user']; 
$pizzaID = $_REQUEST['pizzaID']; 
$pizzaSize = $_REQUEST['pizzaSize']; 
$income = $_REQUEST['income']; 
$address = $_REQUEST['address']; 
$clientName = $_REQUEST['clientName']; 
$telephone = $_REQUEST['telephone']; 

try { 
$insertSale = "INSERT INTO sales VALUES(Null, now(), 'Waiting', :user, :pizzaID, :pizzaSize, :income);"; 
$saleStatement = $connection->prepare($insertSale); 
$saleStatement->execute(array(':user' => $user, ':pizzaID' => $pizzaID, 'pizzaSize' => $pizzaSize, 'income' => $income)); 

$lastID = $connection->lastInsertId(); 

$insertDelivery = 'INSERT INTO deliveries VALUES(:lastID, :address, :clientName, :telephone, 0.0);'; 
$deliveryStatement = $connection->prepare($insertDelivery); 
$deliveryStatement->execute(array(':lastID' => $lastID, ':address' => $address,':clientName' => $clientName, ':telephone' => $telephone)); 

$connection = null; 
} catch(PDOException $ex) { 
    print($ex->getMessage()); 
} 
?> 

Я также меняю кода в классе android, поскольку предыдущий был устаревшим. Я включил также некоторые обработки ошибок (я получаю сообщение, что случилось после того, как insert заявления, если оно пошло не войти):

public static void sendData(String user, Integer pizzaID, Integer pizzaSize, Double income, 
                 String address, String clientName, String telephone){ 
    try { 
     URL url = new URL("http://www.pvice.byethost33.com/insertOrder.php"); 
     URLConnection connection = url.openConnection(); 
     connection.setDoOutput(true); 

     StringBuilder data = new StringBuilder(); 
     data.append(URLEncoder.encode("user", "UTF-8") + "=" + URLEncoder.encode(user, "UTF-8")); 
     data.append("&" + URLEncoder.encode("pizzaID", "UTF-8") + "=" + URLEncoder.encode(pizzaID.toString(), "UTF-8")); 
     data.append("&" + URLEncoder.encode("pizzaSize", "UTF-8") + "=" + URLEncoder.encode(pizzaSize.toString(), "UTF-8")); 
     data.append("&" + URLEncoder.encode("income", "UTF-8") + "=" + URLEncoder.encode(income.toString(), "UTF-8")); 
     data.append("&" + URLEncoder.encode("address", "UTF-8") + "=" + URLEncoder.encode(address, "UTF-8")); 
     data.append("&" + URLEncoder.encode("clientName", "UTF-8") + "=" + URLEncoder.encode(clientName, "UTF-8")); 
     data.append("&" + URLEncoder.encode("telephone", "UTF-8") + "=" + URLEncoder.encode(telephone, "UTF-8")); 

     OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
     writer.write(data.toString()); 
     writer.flush(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      Log.e("LOGG", line); 
     } 

     writer.close(); 
     reader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
Смежные вопросы