2013-08-12 3 views
0

Я экспортирую таблицы из Android (SQLite) в MYSQL, используя PHP для связи с сервером (я использую XAMPP как инструмент).MySQL и PHP parsing странная строка

У меня есть таблица в sqlite со строковым полем (с именем «Старт»), в котором говорится о текущем времени в формате, который я специально разработал. Пример: 0:03:14 - 2013/8/12. Я передаю эту информацию серверу, используя HttpPost в Android.

Приходит проблема. Я создаю таблицу для mysql, используя, например, тип «varchar (50)» для поля «Пуск». Когда я вставить в таблицу, я получил следующее сообщение, используя JSON:

08-12 16:51:25.383: D/MYSQL(26304): jsonResult {"phpError":"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 ':36:12 -- 2013\/8\/6, \r\n\t18:36:17 -- 2013\/7\/6, 30, 57)' at line 2","Success":0,"Message":"Oops! Couldnt upload data","Start":"18:36:12 -- 2013\/8\/6"} 

Как вы видите, исходная строка запуска является 18:36:12, однако, в сообщении об ошибке представляется «использовать около ': 36: 12 ", поэтому кажется, что у него есть некоторая проблема« разбора »строки (?). Кто-нибудь знает, что происходит? Должен ли я использовать другой тип для этого поля?

Это мой PHP-файл:

<?php 

    $response = array(); 

    require_once __DIR__ . '/db_connect.php'; 

    $db = new DB_CONNECT(); 

    $sql1 = "CREATE TABLE IF NOT EXISTS mobile_metadata(ID int, Acc int, Mag int, Gyr int, Temperature int, Grav int, 
    Light int, LinAcc int, Pressure int, Proximity int, Humidity int, RotVec int, Format varchar(50), Start varchar(50), 
    Finish varchar(50), First int, Last int);"; 

    $result1 = mysql_query($sql1); 

    //Data succesfully created/was already created 
    if($result1){ 

     $id = $_POST['id']; $acc = $_POST['Acc']; $mag = $_POST['Mag']; $gyr = $_POST['Gyr']; $temperature = $_POST['Temperature']; $grav = $_POST['Grav']; 
     $light = $_POST['Light']; $linAcc = $_POST['LinAcc']; $pressure = $_POST['Pressure']; $proximity = $_POST['Proximity']; $humidity = $_POST['Humidity']; 
     $rotVec = $_POST['RotVec']; $format = $_POST['Format']; $start = $_POST['Start']; $finish = $_POST['Finish']; $first = $_POST['First']; 
     $last = $_POST['Last']; 

     $sql2 = "INSERT into mobile_metadata(ID, Acc, Mag, Gyr, Temperature, Grav, LinAcc, Pressure, Proximity, Humidity, RotVec, Format, Start, Finish, 
     First, Last) VALUES ($id, $acc, $mag, $gyr, $temperature, $grav, $light, $linAcc, $pressure, $proximity, $humidity, $rotVec, $format, $start, 
     $finish, $first, $last);"; 

     $result2 = mysql_query($sql2); 

     //Data uploaded 
     if($result2){ 

      $response['Success'] = 1; 
      $response['Message'] = "Data uploaded succesfuly"; 
      echo json_encode($response); 
     } 

     //Couldnt upload data 
     else{ 

      $response["phpError"] = mysql_error(); 
      $response['Success'] = 0; 
      $response['Message'] = "Oops! Couldnt upload data"; 
      $response['Start'] = $_POST['Start']; 
      echo json_encode($response); 

     } 
    } 

    //Couldnt create the table 
    else{ 

     $response["phpError"] = mysql_error(); 
     $response["Success"] = 0; 
     $response["Message"] = "Oops! Couldnt create the table"; 
     echo json_encode($response); 

    } 
    ?> 

Спасибо.

ответ

0

Не используйте поле varchar для информации о отметках времени в MySQL. Такие данные очень трудно манипулировать. Вместо этого используйте тип данных DATETIME. Затем вы можете делать такие вещи, как

mytable.finish + INTERVAL 10 SECOND 

и другие интересные вычисления даты.

Как вы вставляете материал в свою базу данных MySQL, используйте функцию STR_TO_TIME, описанную здесь.

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date

Для ваших временных меток формата: 0:03:14 - 2013/8/12 ... Вы можете использовать STR_TO_DATE следующим образом.

STR_TO_DATE('0:03:14 -- 2013/8/12', '%k:%i:%s -- %Y/%c/%e') 

Чтобы сделать это в вашей программе, попробуйте что-то подобное в инструкции SQL.

STR_TO_DATE(%finish, '%k:%i:%s -- %Y/%c/%e') 

Другие люди, ответившие, указали на опасность инъекции SQL. Будьте осторожны: есть badguys, которые действительно хотят использовать ваш сервер MySQL.

+0

Я действительно не нужно делать какие-либо вычисления даты с информацией в базе данных MYSQL, но я буду рассматривать в любом случае, чтобы изменить его. Спасибо за совет! – Rafag

4

Ни одно из ваших полей не указано, и вы DIRECTLY Вставьте предоставленные пользователем данные в запрос. Вы просите за SQL injection attacks.

ЛЮБОЙ из полей, текст/нечисловая должен указываться в разделе значений, например.

INSERT INTO yourtable (textfield) VALUES ($textfield); 

должен быть

INSERT INTO yourtable (textfield) VALUES ('$textfield'); 
              ^--  ^-- note the quotes. 
+1

базовое цитирование также запрашивает SQL-инъекцию ... – njzk2

+0

Это до OP, чтобы исправить. Вы можете привести лошадь к воде, но вы не можете заставить его делать правильное защитное программирование, если он этого не хочет. –

+0

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

1

Вы не процитировать и не спасаясь свои входы , Он требует SQL-инъекции.

Не использовать mysql.mysqli включает в себя методы, чтобы должным образом предотвратить инъекции SQL (и перестать беспокоиться о SQL цитирование и избежать):

$stmt = $mysqli->prepare("INSERT into mobile_metadata(ID, Acc, Mag, Gyr, 
    Temperature, Grav, LinAcc, Pressure, Proximity, Humidity, RotVec, Format, 
    Start, Finish, First, Last) VALUES 
    (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" 
$stmt.bind_params($id, $acc, $mag, $gyr, $temperature, $grav, $light, $linAcc, 
     $pressure, $proximity, $humidity, $rotVec, $format, $start, $finish, 
     $first, $last); 

$stmt->execute(); 
$result = $stmt->get_result(); 
+0

Так что я должен полностью забыть о языке mysql и всегда использовать mysqli? Есть ли большая разница? (Я имею в виду о синтаксисе). – Rafag

+0

нет особо отличие. см. http://php.net/manual/en/mysqlinfo.api.choosing.php – njzk2

+0

У меня есть только одно сомнение ... учитывая все эти опасные вещи, используя mysql api и огромное количество обучающих программ по сети основанный на нем ... как это возможно? Я имею в виду, что это должно быть доброжелательно устаревшим или, по крайней мере, менее используемым! – Rafag