среда, 12 февраля 2014 г.

В mysql записываются знаки вопроса вместо русского

Внезапно, встретился с такой проблемой. Из c++ передавался русский в кодировке windows-1251, таблица - cp1251_general_ci, а записываются все равно ????? Решение оказалось просто - надо после установки соединения 1 раз вызвать:
  mysql_query(conn, "SET NAMES cp1251");

вторник, 11 февраля 2014 г.

Идентификация пользователя

Стал разбираться, как бы точнее идентифицировать пользователя, нашел неплохую статью:
http://javascript.ru/unsorted/id Оставлю тут ссылку, чтобы не потерять.
Сайт, который использует это:
https://panopticlick.eff.org/index.php

понедельник, 3 февраля 2014 г.

Множественные запросы к MySQL

Множественный запрос к MySQL - это запрос, содержащий несколько выражений, записанных через ; Для того, чтобы его провести, при установке соединения нужно указать флаг CLIENT_MULTI_STATEMENTS. Как-то вот так:

mysql_real_connect(mysql, host, user, pwd, db, port, socket, CLIENT_MULTI_STATEMENTS);

Этот флаг так же ставит CLIENT_MULTI_RESULTS. Соответственно, теперь можно будет использовать. Осталось только получить результаты их выполнения. Главная - не забыть, что возвращаются результаты последовательно с каждого выражения, а не только с тех ,кто эти результаты может вернуть. Это, в общем-то, логично, дает возможность узнать, например, количество строк, затронутое каждым из выражений.

Получаются они функцией mysql_store_result, как обычно. Но она будет вызываться ко всем выражениям по очереди. Пролистывать результаты выполнения можно функцией mysql_next_result.
В итоге: вызовом mysql_next_result пропускаем выражения, ничего не возвращающие, у возвращающих - забираем данные с помощью mysql_store_result:

if (mysql_query(mysql, "CALL my_proc(@a, @b); SELECT @a, @b;") != NULL) {
  if (mysql_next_result(mysql)) > 0)
    cout << "mysql_next_result error" << endl;
    MYSQL_RES *result = mysql_store_result(mysql);
    if (result) {
      ...
      mysql_free_result(result);
    }
    else
      cout << "mysql_store_result error" << endl;
  }
else 
  cout << "mysql_query error" << endl;

Если неизвестно, возвращает ли что-нибудь выражение - можно проверить командой mysql_field_count.

Информация - из документации.