Странная проблема с php и mysql. Нет выбранных строк, когда все кажется нормальным? - PullRequest
0 голосов
/ 03 августа 2011

У меня довольно странная проблема с php и mysql. Я делаю следующее в моем PHP-скрипте:

$query1 = "SELECT * FROM ".$src;
$ans1 = mysql_query($query1,$vitoquenId);
echo "<p>Query: \"".$query1."\"<br/>Error: \"".mysql_error()."\"<br/>Total rows extracted: ".mysql_num_rows($ans1)."</p>";

при этом это вывод:

Query: "SELECT * FROM Almacen"
Error: ""
Total rows extracted: 0

Дело в том, что я не должен получать 0 строк, и странно то, что об ошибках не сообщается. Я предоставил все разрешения для своего пользователя и даже попытался подключиться к базе данных от имени пользователя root, но получил то же поведение.

При выполнении запроса непосредственно в командной строке mysql я получаю следующее:

mysql> SELECT * FROM Almacen;
+----+-------------+------------+--------+
| id | nombre      | tipo       | status |
+----+-------------+------------+--------+
|  1 | Tienda      | Principal  | Activo |
|  2 | Dep�sito    | Secundario | Activo |
|  3 | Chaguaramos | Secundario | Activo |
+----+-------------+------------+--------+
3 rows in set (0.00 sec)

Я попытался использовать сервер xampp, а также сервер, настроенный самостоятельно, и получил то же поведение. Я проверил каждый журнал, о котором думал, настроил mysql для записи каждого запроса, и ничего необычного не происходит.

журнал mysql показывает следующее:

110802 16:21:49       101 Connect   victor@localhost on 
                      101 Init DB   saw
                      101 Init DB   sawprueba
                      101 Query SELECT * FROM Almacen
                      101 Quit

Журнал apache ничего не показывает, ни журнал для конкретного сайта. Пожалуйста, любая подсказка, пытающаяся расшифровать это, будет очень цениться !!! Спасибо!!! =)

EDIT:

Я нашел проблему. Это как-то связано с ответом aefxx .

Программа, которую я пишу, является инструментом миграции. Он извлекает информацию из одной базы данных, обрабатывает ее и вставляет в другую базу данных. Для этого мне нужно подключиться к двум базам данных. Я делаю соединение через два класса, используя шаблон синглтона, как предложено в документации php . Вы можете увидеть файл подключения в github repo .

чтобы установить соединение с БД, я вызываю этот класс так:

$vitoquen = Vitoquen::singleton();
$newVitoquen = NewVitoquen::singleton();
$vitoquenId = $vitoquen->getId();
$newVitoquenId = $newVitoquen->getId();

Происходит то, что по какой-то причине он не создает двух отдельных соединений, а вместо этого создает только одно соединение и использует второй db, новый, который является пустым. Я понял, когда увидел журнал mysql:

110802 16:21:49       101 Connect   victor@localhost on 
                      101 Init DB   saw
                      101 Init DB   sawprueba
                      101 Query SELECT * FROM Almacen
                      101 Quit

дважды показывает 101 Init DB ; один для saw и другой для sawprueba. Теперь я не понимаю, почему он не создает два отдельных соединения ... какие-либо предложения ???

большое спасибо за вашу помощь !!! =) * * Тысячу сорок-пять

EDIT:

Я пока не могу ответить самостоятельно, но это решение моей проблемы. В любом случае, спасибо тем, кто потратил время на чтение (и некоторые ответил) этого!

Как видно из документации функции php mysql_connect () , он получает необязательный параметр с именем new_link, который по умолчанию равен false.

new_link
Если второй вызов сделан для mysql_connect () с тем же аргументы, новая ссылка не будет установлена, но вместо этого ссылка Идентификатор уже открытой ссылки будет возвращен. Новая ссылка параметр изменяет это поведение и делает mysql_connect () всегда открытым новая ссылка, даже если mysql_connect () был вызван ранее с тем же параметры. В безопасном режиме SQL этот параметр игнорируется.

Итак, мне просто нужно было добавить true как дополнительный последний параметр к вызову mysql_connect () в обоих классах соединения. решено =)

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Давайте добавим минимальную обработку ошибок и дополнительный запрос, чтобы увидеть, что mysql «думает» о рассматриваемой таблице.

<code>$query1 = "SHOW TABLE STATUS LIKE '$src'";
echo '<pre>Debug: query1=', $query1, "
\ n "; $ ans1 = mysql_query ($ query1,$ vitoquenId) или die (mysql_error ()); while (false! == ($ row = mysql_fetch_assoc ($ ans1))) {foreach ($ row as $ key => $ value) {echo $ key, '= "', $ value, '"';} echo"\ n ";} $ query1 =" SELECT * FROM ". $ src; echo '
Debug: query1=', $query1, "
\ n";$ ans1 = mysql_query ($ query1, $ vitoquenId) или die (mysql_error ());echo "

Query: \" ". $ query1." \ "Ошибка: \ "". Mysql_error (). "\"Всего извлеченных строк: ".mysql_num_rows ($ ans1)."

";
1 голос
/ 03 августа 2011

Вы выбрали правильную базу данных (также называемую схемой) при подключении к вашей СУБД?

Пример:

mysql_select_db("mydatabase", $link);
...