Ваш запрос не помещает ни одной кавычки вокруг каждого значения в предложении VALUES.Если они не все числовые значения или NULL, это приведет к неверному SQL.
Вы можете увидеть его, если вы echo $query
перед его использованием:
INSERT INTO `ToReview` (`number`, `role`, `name`, `email`, `dob`,
`englishskills`, `previousmember`, `reasonYes`, `whyjoin`,
`whatcouldyoubring`, `roleplayexperience`, `roleplayexperiencedetail`,
`commit`, `minimumperiod`) VALUES (NULL, myrole, myname, my@email.com,
2014-02-03, excellent, no, myreason,
myreason, cookies, lots,
lots and lots, yes, 1 month);
Каждое значение строки или даты в вашем операторе INSERT требует одинарных кавычек.
Выможно исправить это, написав такой код:
$query = "INSERT INTO `ToReview` (`number`, `role`, `name`, `email`, `dob`,
`englishskills`, `previousmember`, `reasonYes`, `whyjoin`,
`whatcouldyoubring`, `roleplayexperience`, `roleplayexperiencedetail`,
`commit`, `minimumperiod`) VALUES (NULL, '".$role."', '".$name."', '".$email."',
'".$dob.", '".$englishskills."', '".$previousmember."', '".$reasonYes."',
'".$whyjoin."', '".$whatcouldyoubring."', '".$roleplayexperience."',
'".$roleplayexperiencedetail."', '".$commit."', '".$minimumperiod."');";
За исключением того, что я допустил ошибку и забыл один одинарных кавычек.Вы можете это заметить?
Было бы намного проще, если бы вы использовали подготовленные запросы с параметрами и прекратили копировать переменные в строки SQL.Это облегчает написание динамического SQL, подобного этому, без необходимости ломать голову, пытаясь найти
$query = "INSERT INTO `ToReview` (`number`, `role`, `name`, `email`, `dob`,
`englishskills`, `previousmember`, `reasonYes`, `whyjoin`,
`whatcouldyoubring`, `roleplayexperience`, `roleplayexperiencedetail`,
`commit`, `minimumperiod`) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
Это готовое утверждение, ?
не нужно никаких кавычек.Фактически, вы не должны помещать кавычки вокруг каждого ?
, потому что это сделает его буквальным '?'
вместо заполнителя.
Затем вы подготовите запрос, свяжите в него переменные.
$stmt = mysqli_prepare($con, $query) or die(mysqli_error($con));
mysqli_stmt_bind_param($stmt, 'sssssssssssss', $role, $name, $email,
$dob, $englishskills, $previousmember, $reasonYes,
$whyjoin, $whatcouldyoubring, $roleplayexperience,
$roleplayexperiencedetail, $commit, $minimumperiod);
Вам нужно то же количество переменных, что и для заполнителей, и вы связываете их в том же порядке, в котором они появляются в вашем запросе.Mysqli также требует строку типа 'sss...'
, где каждая буква в этой строке соответствует одному из ваших параметров, а 's' означает, что параметр является строкой, 'i' означает, что это целое число и т. Д.
Один разВы подготовили и связали параметры, просто выполните подготовленный оператор и получите результаты:
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
Таким образом, вы не напрягаете зрение, пытаясь сопоставить все различные типы цитат.
Еще один совет: PDO делает это еще проще!Вы можете связать и выполнить за один шаг, просто передав массив в функцию execute.
$stmt = $pdo->prepare($query);
$stmt->execute([$role, $name, $email,
$dob, $englishskills, $previousmember, $reasonYes,
$whyjoin, $whatcouldyoubring, $roleplayexperience,
$roleplayexperiencedetail, $commit, $minimumperiod]);
$results = $stmt->fetchAll();