2017-01-25 13 views
0

У меня возникли проблемы с конкретной транзакцией SQL, которая работает нормально, когда я запускаю ее в phpMyAdmin, но отказывается запускать из моего собственного php-скрипта.Ошибка MariaDB с кажущейся правильной транзакцией SQL

<?php 

//connect 
$link = mysqli_connect('localhost', 'root', '', 'chemDB'); 
if (!$link) { 
    echo "Error: Unable to connect to MySQL." . PHP_EOL; 
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; 
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; 
    exit; 
} 
mysqli_select_db($link, 'chemDB'); 
echo "Connected successfully\n"; 

//open import CSV 
$file = fopen('cas_list.csv', 'r'); 

//convert decimal comma to float 
function commaToPoint($val) 
{ 
    $val = str_replace(',', '.', $val); 
    return floatval($val); 
} 

//cycle through csv lines 
while (! feof($file)) 
{ 
    $data = fgetcsv($file, '', ';'); 

    $un  = strval($data[0]); 
    $cas = strval($data[1]); 
    $name = strval($data[2]); 
    $m_mass = commaToPoint($data[3]); 
    $m_n = commaToPoint($data[4]); 
    $m_s = commaToPoint($data[5]); 
    $m_cl = commaToPoint($data[6]); 
    $m_f = commaToPoint($data[7]); 
    $m_br = commaToPoint($data[8]); 
    $m_other= commaToPoint($data[9]); 

    $query = "BEGIN; 
    INSERT INTO chemical (cas, name) VALUES ('$cas', '$name'); 
    SELECT LAST_INSERT_ID() INTO @chemical_id; 
    --followed by more SQL... 
    COMMIT;"; 

    print_r($query); 


    $result = mysqli_query($link, $query); 
    if (!$result) 
    { 
    echo("\nError description: " . mysqli_error($link)."\n\n"); 
    } 
} 

fclose($file); 
mysqli_close($link); 

?> 

В этом случае таблица `chemical` в вопросе есть 3 поля: идентификатор (INT 11), саз (varchar24) и имя (varchar255).

Один из входных линий из CSV является: 0072;121-82-4;Cyclotrimethyleentrinitramine, bevochtigd;222,3;6;;;;;138,24;

print_r($query) выводит результирующую строку запроса, которая прекрасно работает в PhpMyAdmin, но не с mysqli_query():

BEGIN;

INSERT INTO `chemical` (`cas`, `name`) VALUES ('121-82-4', 'Cyclotrimethyleentrinitramine, bevochtigd');

SELECT LAST_INSERT_ID() INTO @chemical_id;

--followed by more SQL...

COMMIT;

Однако, независимо от того, что формат используется Я заканчиваю с ошибкой:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BEGIN; INSERT INTO `chemical` (`cas`, `name`) VALUES ('121-82-4', 'Cyclotrimet' at line 2`

+1

[Little Bobby] (http://bobby-tables.com/) говорит, что *** [ваш скрипт находится под угрозой для SQL Injection Attacks.] (Http://stackoverflow.com/questions/60174/how- can-i-prevent-sql-injection-in-php) *** Узнайте о запросах [подготовленных] (http://en.wikipedia.org/wiki/Prepared_statement) для [MySQLi] (http://php.net /manual/en/mysqli.quickstart.prepared-statements.php). Даже [избегая строки] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) небезопасно! [Не верьте?] (Http://stackoverflow.com/q/38297105/1011527) –

+0

Возможный дубликат [Работа с указателями файлов на csv] (http://stackoverflow.com/questions/41294380/working -with-file-pointers-on-a-csv) – e4c5

+1

Помимо проблемы с sql-инъекцией, вы, вероятно, хотите вместо mysqli_multi_query. – jeroen

ответ

0

mysqli_multi_query() исправил проблему, спасибо. К проблемам с sql injection: этот скрипт запускается конфиденциально, чтобы добавлять данные в базу данных, а не публично доступную и удаляемую впоследствии.