2012-06-04 2 views
2

Я работаю над базой данных с 3 таблицами, некоторые с перекрывающейся информацией. Несколько столбцов из каждой таблицы могут быть обновлены пользователем через веб-приложение, которое я создаю. Но ... Есть проблема. Не уверен, что это такое, но мои обновления не происходят. Мне интересно, если что-то не так с моим запросом. (На самом деле, после отладки, я вполне уверен, что есть).Что-то не так с моим запросом?

if (empty($errors)) { 
    $query1 = "UPDATE owner SET 
      name = '{$name}' 
     WHERE ownerId= '{$ownerId}'"; 
    $query1_result = mysql_query($query1); 
    if (mysql_affected_rows()==1) { 
     $query2 = "UPDATE queue_acl SET 
        date_expires = '{$date_expires}' 
       WHERE user_id='{$ownerId}'"; 
     $query2_result = mysql_query($query2); 
     if (mysql_affected_rows()==2) { 
      $query3 = "UPDATE ownerOrganization SET 
        orgId = {$orgId} 
       WHERE ownerId = '{$ownerId}'"; 
      $query3_result = mysql_query($query3); 
      if (mysql_affected_rows()==3) { 
        $_SESSION['name'] = $name; 
        $_SESSION['updates_occurred'] = true; 
      } 
     } 
    } 

Извините, если это тривиально; Раньше я никогда не работал с несколькими таблицами. Большое спасибо за любые/все предложения. -N

+0

Возможно, вы захотите заглянуть в mysql_error(). Как правило, гораздо проще дать базу данных рассказать вам, что не так с вашим запросом, чем расчесывать ее самостоятельно. –

+0

@NVidodiv почему у вас есть '{$ date_expires}' вместо '$ date_expires'? – jcho360

+0

Привет, я поместил mysql_error в самое нижнее (или должен поместить его после каждого mysql_affected_rows?). Он не показывает никаких ошибок ... Фактически, выглядит так, как будто это работает в веб-приложении. Но когда вы проверяете базу данных, ничего не обновлялось – nv39

ответ

1

Это не хорошая привычка обновлять таблицы так, как вы это делаете. Если обновления связаны каким-то образом, вы можете подумать о создании транзакции. Сделки убедитесь, что все обновления выполняются (а если нет, то откат делается (что означает обновление не будет выполняться)):

// disable autocommit 
mysqli_autocommit($dblink, FALSE); 

// queries 
$query1 = mysqli_query($dblink, "UPDATE owner SET name = '{$name}' WHERE ownerId= {$ownerId}'"); 
$query2 = mysqli_query($dblink, "UPDATE queue_acl SET date_expires = '{$date_expires}' WHERE user_id='{$ownerId}'"); 
$query3 = mysqli_query($dblink, "UPDATE ownerOrganization SET orgId = {$orgId} WHERE ownerId = '{$ownerId}'"); 

if($query1 && $query2 && $query3) 
{ 
    mysqli_commit($dblink); 
    $_SESSION['name'] = $name; 
    $_SESSION['updates_occurred'] = true; 
} 
else 
    mysqli_rollback($dblink); 

Я не проверял, но думаю, он должен работать. Также вы должны взглянуть на mysqli или подготовленные инструкции, поскольку mysql_ устарел.

+0

Привет libjup, спасибо за отличный ответ :-). Тем не менее, я получаю десятки сообщений об ошибках, когда я выполняю это. В основном повторяющиеся сообщения «$ dblink not defined», «mysqli_autocommit() ожидает, что параметр 1 является mysqli, null given», и «mysqli_query ожидает, что запрос будет первым аргументом» и т. Д. Любая идея, почему это происходит? – nv39

+0

Hi Vidovic, только инициализировать $ dblink следующим образом: $ dblink = mysqli_connect ("localhost", "user", "password", "dbname") или die ("Login-Error"); – libjup

+0

Я на самом деле пробовал это изначально, но я получаю эту ошибку - mysqli_select_db() ожидает, что параметр 1 будет mysqli, строка задана. (Это когда я выбираю базу данных, к которой я хочу подключиться). Код выглядит так: $ db_select = mysqli_select_db (DB_NAME, $ dblink); – nv39

0

Первый выпуск может быть сфера действия. Ваши условные условия неверны?

If (result ==1) 
{ 
    if(result == 2) 
    { 
    ... 
    } 
} 

Таким образом, если ваш первый результат больше 1, то все внутренние условия будут пропущены.

Если я понимаю, что это должно быть:

if(result ==1) 
{ 
} 
elseif(result ==2) 
{ 
} 
...(other conditions)... 
else 
{ 
} 

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

Вторая проблема может заключаться в том, что вы указываете все данные, кроме orgId = {$ orgId}. Вероятно, это должно быть orgId = '{$ orgId}', если id - некоторая случайная строка, а не цитирование, вызовет проблемы.

Последняя проблема заключается в проверке владельца. Если по какой-то причине это пусто, ваш запрос не будет выполнен, потому что если id = 0 (при условии, что у вас есть автоматическое увеличение) никогда не будет правдой. Поместите a if (! Empty (ownerId) conditional.

+0

Привет, Шон, спасибо! Я не уверен, хочу ли я делать «if..else», потому что мне нужно * все * обновления для выполнения. Вот почему я настроил это так - если кто-то терпит неудачу, все должно потерпеть неудачу. Я принял ваше предложение относительно «orgId». Владелец не автоинкремлен, но он уникален (это фактически имя пользователя, например, мое было бы nvidovic). Поэтому он никогда не должен быть 0 или целым числом – nv39

+0

Но если переменная, содержащая имя пользователя, пуста, то предложение where будет WHERE ownerId = '', которое будет пустым. Кроме того, вы могли бы, вероятно, сделать все обновления с помощью JOINS. – Shawn

Смежные вопросы