@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 Автор вопроса
Всем спасибо. Надо писать через подготовленные выражения
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы