Вставка в базу данных с STMT и MySQLI
Вопрос
Привет, я впервые играю с STMT (просматривая конвертирование моего кода после ранее, используя стандартные функции MySQLI через класс расширения.
Однако я не могу заставить это работать. Я использую PHP 5.2.11 и MySQL 4.1.22.
У меня есть структура таблицы, как так:
CREATE TABLE IF NOT EXISTS `tags` ( `tag_id` smallint(3) unsigned NOT NULL auto_increment, `title` varchar(32) NOT NULL default '', PRIMARY KEY (`tag_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
И вот мой код, я использовал http://devzone.zend.com/article/686 и php.net как ссылки.
$mysqli = new mysqli('***','***','***','***'); if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $stmt = $mysqli->prepare("INSERT INTO tags (title) VALUES (?)"); $stmt->bind_param('s', $title); $title = 'test 123'; $stmt->execute(); $stmt->close(); $mysqli->close();
Это кажется достаточно простым, и я надеюсь, что он вставит «тест 123» в столбец заголовка с автоматическим увеличением TAG_ID. Но вместо этого заголовок пуст (TAG_ID делает Incremenet, как можно предположить).
У кого -нибудь есть идеи, где я ошибаюсь?
=================================================
Как указал Атли и проверял, он работает на версии 5 и выше MySQL. Таким образом, это, вероятно, проблема с использованием старой версии SQL, хотя в документации PHP.NET говорится, что MySQLI «позволяет вам получить доступ к функциональности, предоставленной MySQL 4.1 и выше».
Если кто -то может предложить другую причину, по которой он может не работать или как заставить его работать в моей среде, это было бы здорово. Если нет, я полагаю, что я буду продолжать свое собственное расширение класса MySQLI, чтобы подготовить и чистить запросы.
Решение
Я протестировал ваш код на своем тестовом сервере, и он работает нормально. (Используя PHP 5.3 и MySQL 5.1.37)
Так что это не сам код или дизайн базы данных.
Моим первым предположением была бы несовместимость с вашей версией MySQL.
Вы можете попробовать использовать mysqli_stmt :: get_warnings Функция, чтобы увидеть, есть ли какие -либо предупреждения.
Если это вообще возможно, я бы порекомендовал обновить MySQL. Версия, которую вы используете, становится довольно древней. - Я собирался установить 4.1 и проверить это на нем (Просто для развлечения: p) Но у них даже нет доступных загрузок.
Другие советы
Определите заголовок $, прежде чем использовать его. Вы должны включить эту линию
$title = 'test 123';
до
$stmt->bind_param('s', $title);
Полный код:
$mysqli = new mysqli('***','***','***','***');
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$title = 'test 123';
$stmt = $mysqli->prepare("INSERT INTO tags (title) VALUES (?)");
$stmt->bind_param('s', $title);
$stmt->execute();
$stmt->close();
$mysqli->close();
Вместо
$stmt->bind_param('s', $title);
попробуй это:
$stmt->bindParam(1, $title, PDO::PARAM_STR);