Используйте подготовленные операторы, а PDO улучшит безопасность и сделает код более эффективным.
Попробуйте что-то вроде этого:
//....
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
// connecting to db
$pdo = new PDO($dsn, $user, $pass, $opt);
$sql = "INSERT INTO Questions (Question) VALUES (:question)";
try{
//prepare your first query
$stmt = $pdo->prepare($sql);
//now you can bind your parameters to the query
$stmt->bindParam(':question', $question, PDO::PARAM_STR);
$stmt->execute();
$id = $pdo->lastInsertId();
// check id instead -- result can be true even if the row wasn't inserted
if ($id > 0) {
// define your next query only once!
$query = "INSERT INTO Choices(Choice, Question_ID, Category_ID) VALUES (:choice, :id, :category)";
//prepare only once!
$stmtQuery = $pdo->prepare($query);
//bind only once!
$stmtQuery->bindParam(':choice', $choice, PDO::PARAM_STR);
$stmtQuery->bindParam(':id', $id, PDO::PARAM_INT); //assuming id is type int
$stmtQuery->bindParam(':category', $category, PDO::PARAM_STR);
foreach ($choices as $choice) {
if ($choice != '') {
//Choice query
foreach ($categories as $category) {
if ($category != '') {
//execute as often as needed
$stmt->execute();
}
}
}
}
}
else {
echo = "no row inserted";
}
}
catch (PDOException $e){
echo = "An error occurred." . $e->getMessage();
}
Отказ от ответственности
Я просто набрал это в стандартном текстовом редакторе.Поэтому я надеюсь, что я не сделал слишком много ошибок, пожалуйста, будьте бдительны.
РЕДАКТИРОВАТЬ
С функцией вставки зависимостей (... необходимость вставки новой строкиТОЛЬКО в случае успешной предыдущей вставки) следует включить стратегию beginTransaction / commit / rollback, которая подходит лучше всего.Используя $pdo->beginTransaction();
в начале $pdo->rollback();
, если вы хотите откатиться при возникновении ошибки, и $pdo->commit();
, где вы готовы сделать все изменения «постоянными».