MySQL запрос неверен - PullRequest
0 голосов
/ 19 мая 2018

Понятия не имею, почему следующий MySQL Query продолжает давать сбой.Он говорит мне, что имеет неверный синтаксис.Об этом всегда говорится в области электронной почты кода, но очевидных ошибок нет.Я очищаю строки перед передачей их в запрос MySQL

$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.");";

$result = mysqli_query($con, $query) or die(mysqli_error($con));

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Строки типа $name должны быть заключены в '.

$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."');";

Или вы можете использовать подготовленные операторы

0 голосов
/ 19 мая 2018

Ваш запрос не помещает ни одной кавычки вокруг каждого значения в предложении 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();
0 голосов
/ 19 мая 2018

вы закрываете двойные кавычки в конце точки с запятой, удалите это и попробуйте снова

$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')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...