2016-01-15 3 views
1

Я пытаюсь запустить транзакцию mysql и вставить данные в базу данных. Источник базы данных sql можно найти на github here. Здесь ошибка:Ошибка синтаксиса MYSQL в php, но sql

Error: START TRANSACTION; INSERT INTO Books(Title, PublicationDate, PurchaseDate, Description, LocationID, GenreID) VALUES('Simple Genius', '2008-4-1','2009-5-7','','Hardbook Library','Fiction'); SET @bookid = LAST_INSERT_ID(); INSERT INTO BookAuthors(FirstName, MiddleName, LastName) VALUES('David', '', 'Baldacci'); SET @authorid = LAST_INSERT_ID(); INSERT INTO AuthorsInBooks(AuthorID, BookID) VALUES(@authorid, @bookid); COMMIT; 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 'INSERT INTO Books(Title, PublicationDate, PurchaseDate, Description, LocationID,' at line 3

рядом с «INSERT INTO книг (название, PublicationDate, PurchaseDate, Описание, LocationID,» не имеет смысла для меня, потому что не хватает GenreID после LocationID я упускаю что-то когда.? Я скопировать и вставить этот код в PHPMyAdmin он отлично работает мой PHP версия 5.4

Вот PHP код:..

$sql = " 
START TRANSACTION; 

INSERT INTO Books(Title, PublicationDate, PurchaseDate, Description, LocationID, GenreID) 
VALUES('".$Title."', '".$YearWritten."','".$YearPurchased."','".$Description."','".$Location."','".$Genre."'); 

SET @bookid = LAST_INSERT_ID(); 

INSERT INTO BookAuthors(FirstName, MiddleName, LastName) 
VALUES('".$AuthFirstName."', '".$AuthMiddleName."', '".$AuthLastName."'); 

SET @authorid = LAST_INSERT_ID(); 

INSERT INTO AuthorsInBooks(AuthorID, BookID) 
VALUES(@authorid, @bookid); 

COMMIT; 
"; 

if (mysqli_query($conn, $sql)) { 
    echo "New record created successfully"; 
} else { 
    echo "Error: " . $sql . "<br>" . mysqli_error($conn); 
} 

mysqli_close($conn); 
+1

Пожалуйста, ознакомьтесь с Http: // StackOverflow. com/questions/60174/how-can-i-prevent-sql-injection-in-php? rq = 1 – user2864740

+0

Мне сказали использовать это. Это недостаточно эффективно? @ user2864740 mysqli_real_escape_string –

+0

@JacobWilson: Вы можете захотеть прочитайте http://stackoverflow.com/q/5741187, что равнозначно для mysqli. – eggyal

ответ

2

mysqli_query() может выполнить только 1 запрос, если вы хотите выполнить несколько запросов, вы необходимо:

if (mysqli_multi_query($conn, $sql)) { 
+1

Но вместо этого просто используйте вызовы API для управления транзакциями и отправьте каждую команду separatel y ... и, конечно, параметризуем эти переменные! – eggyal

+1

Работал отлично. Спасибо огромное! –

+0

@eggyal Я полностью согласен. – jeroen

2

В ответ на your comment «Могу ли я увидеть пример того, что вы имеете в виду под названием @eggyal? «:.

// mysqli provides API calls for managing transactions 
mysqli_autocommit($conn, false); 

// parameterise variables - NEVER concatenate them into dynamic SQL 
$insert_book = mysqli_prepare($conn, ' 
    INSERT INTO Books 
    (Title, PublicationDate, PurchaseDate, Description, LocationID, GenreID) 
    VALUES 
    (?, ?, ?, ?, ?, ?) 
'); 

// bind the variables that (will) hold the actual values 
mysqli_stmt_bind_param(
    $insert_book, 
    'siisss', // string, integer, integer, string, string, string 
    $Title, $YearWritten, $YearPurchased, $Description, $Location, $Genre 
); 

// execute the statement (you can change the values of some variables and 
// execute repeatedly without repreparing, if so desired - much faster) 
mysqli_stmt_execute($insert_book); 

// mysqli provides API calls for obtaining generated ids of inserted records 
$book_id = mysqli_insert_id($conn); 

// ... etc ... 

// use the API call to commit your transaction 
mysqli_commit($conn); 

// tidy up 
mysqli_stmt_close($insert_book); 

Обратите внимание, что я не учтенный выше любого обнаружения ошибок/обработки, который вы бы, конечно, нужно включить в любой реальном мире код

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