@pearplace

Количество переменных не совпадает с количеством токенов при записи в таблицу БД. Можно ли использовать массив как переменную?

Invalid parameter number: number of bound variables does not match number of tokens in /home/c/cn82200/udm/public_html/app/database/db.php:164

PDOStatement->execute(Array) #1 ... insert('posts', Array) #2

PHP код функции
function insert($table, $params)
{
    global $pdo;
    $i = 0;
    $coll = '';
    $mask = '';
    foreach ($params as $key => $value) {
        if ($i === 0) {
            $coll = $coll . "$key";
            $mask = $mask . "'" . "$value" . "'";
        } else {
            $coll = $coll . ", $key";
            $mask = $mask . ", '" . "$value" . "'";
        }
        $i++;
    }

    $sql = "INSERT INTO $table ($coll) VALUES ($mask)";

    $query = $pdo->prepare($sql);
    $query->execute($params);
    dbCheckError($query);
    return $pdo->lastInsertId();
}


PHP код контроллера
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_post'])) {
//здесь был код для проверки картинки при загрузке
    $title = trim($_POST['title']);
    $img = trim($_POST['img']);
    $city = trim($_POST['city']);
    $topic = trim($_POST['topic']);
    $description = trim($_POST['description']);

    if ($title === '' || $description === '' || $topic === '' || $city === '') {
        $errMsg = 'Error';
    } else {
        $post = [
            'title' => $title,
            'img' => $_POST['img'],
            'id_topic' => $topic,
            'id_city' => $city,
            'description' => $description
        ];
        $post = insert('posts', $post);
        $post = selectOne('posts', ['id_post' => $id_post]);
        $succMsg = 'Published';
    }


БД
65055390493eb163545106.png

Все костыльное. Понятия не имею как исправить код, в PHP всего неделю-две суммарно. На мой взгляд количество переменных и токенов совпадает, но видимо это не так. Сама ошибка появилась только после загрузки на хостинг, до этого все всех устраивало. Подскажите, пожалуйста, какие строки надо переписать и на что их заменить. Спасибо
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Здесь, собственно, весь код на выброс.
-    $i = 0;
-    $coll = '';
-    $mask = '';
-    foreach ($params as $key => $value) {
-        if ($i === 0) {
-            $coll = $coll . "$key";
-            $mask = $mask . "'" . "$value" . "'";
-        } else {
-            $coll = $coll . ", $key";
-            $mask = $mask . ", '" . "$value" . "'";
-        }
-        $i++;
-    }
+    $coll = implode(',', array_keys($params));
+    $mask = ':' . implode(',:', array_keys($params));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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