PHP - Ошибка выполнения транзакции MySQL - PullRequest
1 голос
/ 26 июля 2011
    $tran = "START TRANSACTION;";  

    $tran_res = mysql_query($tran);  

    $qry_1 = "INSERT INTO docList (doc_ip , doc_country , doc_ref) VALUES ('$ip' , '$country' , '$http_ref');";  
    $res_1 = mysql_query($qry_1);  
    if(!$res_1)
        die ("qry1 fail " . mysql_error() );  

    $ins_id = mysql_insert_id();  
    if(!$ins_id) 
        die ("ins id fail " . mysql_error() );  
    echo "<b>$ins_id</b>";  

    $qry_2 = "INSERT INTO docContent (doc_id , cont_date , cont_title , cont_aim , cont_obj , cont_theory , cont_sw , cont_code) VALUES ('$ins_id' , '$dt' , '$title' , '$aim' , '$obj' , '$th' , '$sw' , '$code');"; 

    $res_2 = mysql_query($qry_2);  
    if(!$res_2)
        die("qry2 fail " . mysql_error() );  `

Выполнение выше возвращает следующую ошибку:

2 qry fail 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 'login'); if($query->num_rows()>0) return $query->result_array(); } ' at line 1

В действительности выполнение $qry_2 не выполняется, но я озадачен ошибкой, которую он показывает (в строке 1 нет такого кода, как упомянуто в примечании об ошибке). Более того, запрос ($qry_2) правильно выполняется в консоли MySql.

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Вывести содержимое $qry_2, чтобы увидеть фактическое выполнение оператора SQL. Скорее всего, у вас есть уязвимости в SQL-инъекциях, и одна из вставляемых вами переменных где-то содержит как минимум ', что вызывает синтаксическую ошибку.

например. если у вас есть

$var = "O'Reilly";
$sql = "INSERT INTO names (name) VALUES ('$var')";

вы получите

INSERT INTO names (name) VALUES ('O'Reilly');

, который будет интерпретироваться как:

'O' - string containing the letter "O"
Reilly - a field named "Reilly", with no operator between this "field" and the "O" previous
'); - a weird unterminated string, also with no operator between this and the previous field.

Чтобы обойти это, вы ДОЛЖНЫ передать свои переменные через mysql_real_escape_string(), что предотвратит возникновение таких ошибок. Это превратит O'Reilly в O\'Reilly, что «безопасно» использовать в вашем запросе.

1 голос
/ 26 июля 2011

Вы не опубликовали реальный запрос, полученный сервером MySQL, но я бы осмелился сказать, что вы не использовали mysql_real_escape_string () для ввода ваших данных в SQL.

(Вы пытаетесь вставить код PHP в базу данных?)

...