@Koshkin_I

Почему INSERT INTO равно null (не работает)?

Здравствуйте!
Есть такой код
<?php
header('Content-Type:application/json');
require_once 'pdoconfig.php';

//if($_SERVER["CONTENT_TYPE"] == "application/json; charset=utf-8"){
$postData = file_get_contents('php://input');
var_dump($postData);
$data = json_decode($postData,true);
  var_dump($data);

  try {
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $conn -> query("SET NAMES utf8");
  //  $conn->set_charset("utf8");
    echo "Connected to $dbname at $host successfully.\n";    
  echo " type ={$_SERVER["CONTENT_TYPE"]}\n";
} catch (PDOException $pe) {
    http_response_code(470);// int|bool;
    die("Could not connect to the database $dbname :" . $pe->getMessage());
}
try{
  $id=$data['id'];
$asp=$data['aspectRatio'];
$yie=$data['yields'];
$c_t_m=$data['cookTimeMinutes'];
$country = $data['country'];
$desc=$data['description'];
$p_t_m = $data['prepTimeMinutes'];
$t_t_m = $data['totalTimeMinutes'];
$name = $data['name'];
$t_url=$data['thumbnailUrl'];
  
  echo "id= $id, asp=$asp,yel=$yie, ctm=$c_t_m,country=$country,desc=$desc,ptm=$p_t_m,ttm=$t_t_m,name=$name,url=$t_url\n";


$err = $conn -> query("INSERT INTO RECIPE(recipe_id,aspect_ratio,yields,cook_time_minutes,country,descriptions,prep_time_minutes,total_time_minutes,name,thumnai_url) VALUES('$id','$asp','$yie','$c_t_m','$country','$desc','$p_t_m','$t_t_m','$name','$t_url')");
  
  
  echo "\nrec PDOStatement::errorCode(): ";
print $err->errorCode();

Водном случае отрабатывает нормально

I/okhttp.OkHttpClient: id= 8630, asp=9:16,yel=Порции: 1, ctm=20,country=США,desc=Если вам надоели .....,ptm=5,ttm=25,name=Овсяная смесь из теста для печенья с шоколадной крошкой,url=https://img.buzzfeed.com/thumbnailer-prod-us-east-1/video-api/assets/432886.jpg
I/okhttp.OkHttpClient: 
I/okhttp.OkHttpClient: rec PDOStatement::errorCode(): 00000

В другом нет
I/okhttp.OkHttpClient: id= 8629, asp=9:16,yel=Порции: 1, ctm=10,country=США,desc=Каждый март McDonald's ......,ptm=5,ttm=25,name=Имитатор коктейля McDonald's Shamrock Shake,url=https://img.buzzfeed.com/thumbnailer-prod-us-east-1/video-api/assets/432796.jpg
I/okhttp.OkHttpClient: 
I/okhttp.OkHttpClient: rec PDOStatement::errorCode():


В логах сервера во втором случае:
Backend fatal error: PHP Fatal error:  Uncaught Error: Call to a member function errorCode() on bool in /home/ascer175/domains/androidyava.today/public_html/recipe_project/dbconnect.php:41\nStack trace:\n#0 {main}\n  thrown in /home/ascer175/domains/androidyava.today/public_html/recipe_project/dbconnect.php on line 41\n

Вообще не понимаю как так?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Нельзя вот так напрямую подставлять данные в запрос.
У вас во втором случае апостроф в слове McDonald's ломает запрос и он не выполняется.
Смотрите что получается, обратите внимание на подсветку в конце:

INSERT INTO RECIPE(recipe_id) VALUES('123','asp','McDonald's','c_t_m')

Следует использовать подготовленные выражения.
Ну или на крайний случай использовать https://www.php.net/manual/ru/pdo.quote.php
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Не ищите сообщения об ошибке там, где их нет.
query в случае ошибки возвращает false. А у false никакого errorCode быть не может.
Используйте исключения и подготовленные выражения.
--$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
--$conn -> query("SET NAMES utf8");
++$conn = new PDO(
++    "mysql:host=$host;dbname=$dbname",
++    $username,
++    $password
++    [
++        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
++        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
++    ],
++);
--$err = $conn -> query("INSERT INTO RECIPE(recipe_id,aspect_ratio,yields,cook_time_minutes,country,descriptions,prep_time_minutes,total_time_minutes,name,thumnai_url) VALUES('$id','$asp','$yie','$c_t_m','$country','$desc','$p_t_m','$t_t_m','$name','$t_url')");
--echo "\nrec PDOStatement::errorCode(): ";
--print $err->errorCode();
++$req = $conn->prepare(<<<REQ
++    INSERT INTO RECIPE (
++        recipe_id, aspect_ratio, yields, cook_time_minutes, country, descriptions,
++        prep_time_minutes,total_time_minutes,name,thumnai_url
++    ) VALUES (
++        :recipe_id, :aspect_ratio, :yields, :cook_time_minutes, :country, :descriptions,
++        :prep_time_minutes, :total_time_minutes, :name, :thumnai_url
++    )
++REQ);
++$req->execute([
++    'recipe_id' => $data['id'],
++    'aspect_ratio' => $data['aspectRatio'],
++    'yields' => $data['yields'],
++    'cook_time_minutes' => $data['cookTimeMinutes'],
++    'country' => $data['country'],
++    'descriptions' => $data['description'],
++    'prep_time_minutes' => $data['prepTimeMinutes'],
++    'total_time_minutes' => $data['totalTimeMinutes'],
++    'name' => $data['name'],
++    'thumnai_url' => $data['thumbnailUrl'],
++]);
Ответ написан
Комментировать
@Koshkin_I Автор вопроса
Всем спасибо. Надо писать через подготовленные выражения
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽