Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Zmiana rekordu mysql gdy wystepuja roznice w 2 tablicach
jaro74
post 4.02.2011, 10:58:51
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 29.01.2011

Ostrzeżenie: (0%)
-----


Witam

musze wykonac POZORNIE jak dla mnie prosta operacje na 2 tablicach

w tablicy jos_comprofiler mam 3 pola cb_001 , cb_002 i cb_idwlasciciel

jesli pola cb_002 i cb_idwlasciciel sie roznia od siebie wowczas w tablicy jos_users w polu 'block' ma zmienic wartosc 0 na 1 wg wspolnego mianownika cb_001 = username

w tej chwili mam 1 uzytkownika, ktory ma rozne pola 'cb_002' i 'cb_idwlasciciel' i zamiast zmienic mi tylko jego zmienia mi wszystkich


Kod
//username   tabela jos_users
//block tabela jos_users
//cb_001 tabela jos_comprofiler
//cb_002   tabela  jos_comprofiler
//cb_idwlasciciel tabela   jos_comprofiler

mysql_select_db($db2,$connection1);
// wybieram z  tabel  rekordy ktore  maja zgodne  cb_001=username ale rozne  cb_002<>cb_idwlasciciel
$sql ="SELECT * FROM  jos_comprofiler, jos_users where jos_comprofiler.cb_001 = jos_users.username and jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel";
$results = mysql_query($sql);  
while($rek = mysql_fetch_array($results)){

$usr = $rek['username'];
$bl = $rek['block'];
$cb001 = $rek['cb_001'];
$cb002 = $rek['cb_002'];
$cb_idw = $rek['cb_idwlasciciel'];

//  aktalizuj pole block w tabeli jos_user wowczas gdy rekordy ktore  maja zgodne  cb_001=username ale rozne  cb_002<>cb_idwlasciciel
mysql_query("UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and  $cb001=$usr ")or die("<br> jos_users not updated. Error is: " . mysql_error());             

print $usr.' > '.$bl.' >'.$cb001.' > '.$cb002.' >'.$cb_idw.' ';
}


jakieś sugestie ? nie ma mocnych na ten problem ?

nie no, serio nikt nie potrafi rozwiazac problemu ?

Ten post edytował jaro74 30.01.2011, 15:27:15
Powód edycji: [Daiquiri]: Zamykam temat. Jak wymyślisz rozsądną nazwę/tytuł wątku - prześlij mi na PW, a temat zostanie odblokowany. Otwieram :)
Go to the top of the page
+Quote Post
Noidea
post 4.02.2011, 12:41:37
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


Wyświetl sobie w przeglądarce oba zapytania:
  1. $sql = "SELECT * FROM jos_comprofiler, jos_users where jos_comprofiler.cb_001 = jos_users.username and jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel";
  2. echo $sql . "<br>";
  3.  
  4. // (...)
  5.  
  6. $sql2 = "UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and $cb001=$usr";
  7. echo $sql2 . "<br>";
  8. mysql_query( $sql2 ) or die("<br> jos_users not updated. Error is: " . mysql_error());

i przypatrz się na sekcje WHERE.


Podpowiem, że w pierwszym zapytaniu zbudowałeś tą sekcję prawidłowo, a w drugim masz kompletne bzdury smile.gif


--------------------
Go to the top of the page
+Quote Post
jaro74
post 5.02.2011, 08:55:45
Post #3





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 29.01.2011

Ostrzeżenie: (0%)
-----


wiem, ten warunek

Kod
6.$sql2 = "UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and  $cb001=$usr";


wygląda logicznie i NIE DZIAŁA (zamiast wybrane pozycje zamienia wszystkie )


z tego co wywnioskowałem w manulu where działa tylko w przypadku równości a nie różnic dla tego terzeba użyć w jakiś sposób CASE w tym przypadku

poniższy kod też nie działa

Kod
mysql_query("UPDATE `jos_users` SET block = CASE WHEN ($cb002<>$cb_idw) THEN block = '1' WHEN ($cb002=$cb_idw) THEN block = '0' END");


jakieś propozycje ?

Ten post edytował jaro74 5.02.2011, 09:00:15
Go to the top of the page
+Quote Post
Noidea
post 5.02.2011, 11:02:28
Post #4





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


Cytat(jaro74 @ 5.02.2011, 08:55:45 ) *
wiem, ten warunek

Kod
6.$sql2 = "UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and  $cb001=$usr";


wygląda logicznie i NIE DZIAŁA (zamiast wybrane pozycje zamienia wszystkie )

Coś mi mówi, że jednak nie chciało ci się wyświetlić tego zapytania przez echo. Zapytanie działa tak jak mu kazałeś, czyli zmienia wartość `block` w wierszach spełniających warunek. A jako że wszystkie wiersze spełniają ten warunek, to zmienia we wszystkich.

Tak samo gdybyś napisał:
  1. while( 2 != 3 and 1 == 1 )
  2. {
  3. // do something
  4. }

utworzyłbyś poprawnie działającą nieskończoną pętlę, nawet jeśli niekoniecznie o to ci chodziło.


Podpowiem dwie rzeczy:
1. W zapytaniu UPDATE sekcja WHERE powinna wyglądać tak:
kolumna = wartość
a u ciebie wygląda tak:
wartość = wartość

2. W pierwszym zapytaniu wyciągasz też z bazy klucz główny tabeli `jos_users` (pewnie jakieś jos_users.id) - przyda się w zapytaniu UPDATE


Cytat
z tego co wywnioskowałem w manulu where działa tylko w przypadku równości a nie różnic

Działa w przypadku obu. Z resztą w tym pierwszym zapytaniu masz i równość i różnicę, a działa poprawnie.


--------------------
Go to the top of the page
+Quote Post
jaro74
post 5.02.2011, 13:54:29
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 29.01.2011

Ostrzeżenie: (0%)
-----


Sprawdzilem , nie zmienia , zmienia wszystkim na 1

napisz prosze całe rozwiązanie, od tygodnia się męczę z tym sad.gif

jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel

to samo co

$cb002<>$cb_idw

jos_users
___________________
username | block
___________________
kowalski | 1
wisniewski | 0
___________________


jos_comprofiler

________________________________
cb_001 | cb_002 | cb_idwlasciciel
________________________________
kowalski | 00001 | 00234
wisniewski | 00002 | 00002


Kod
$sql2 = "UPDATE jos_users SET block = '1' where jos_comprofiler.cb_001 = jos_users.username and jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel"


nie działa sad.gif

Ten post edytował jaro74 5.02.2011, 14:26:03
Go to the top of the page
+Quote Post
Noidea
post 5.02.2011, 14:56:22
Post #6





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


Cytat
jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel

to samo co

$cb002<>$cb_idw


Nie. Jakbyś wyświetlił to zapytanie, to zauważyłbyś różnicę:
  1. -- Zapytanie:
  2. SELECT * FROM jos_comprofiler WHERE jos_comprofiler.cb_002 <> jos_comprofiler.cb_idwlasciciel
  3. -- Zwróci inne wyniki niż:
  4. SELECT * FROM jos_comprofiler WHERE 00001 <> 00234
  5.  
  6. -- Analogicznie jest w przypadku UPDATE, z którym masz problemy



Jako że nie chce mi się już prowadzić tej dyskusji, to masz gotowca, który dodatkowo nie potrzebuje pierwszego zapytania ani pętli while:
  1. UPDATE jos_users, jos_comprofiler
  2. SET jos_users.block = 1
  3. WHERE jos_comprofiler.cb_001 = jos_users.username AND jos_comprofiler.cb_002 <> jos_comprofiler.cb_idwlasciciel


--------------------
Go to the top of the page
+Quote Post
jaro74
post 5.02.2011, 15:17:37
Post #7





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 29.01.2011

Ostrzeżenie: (0%)
-----


wszystko sie rozchodzilo o to , ze w opcji UPDATE oprócz jos_users musiałem dodać jos_comprofiler

jos_users, jos_comprofiler SET jos_users.block = 1

już jest git , dzieki


ps

dziwne , ze od tygodnia nikt nie mogl mi tego wytlumaczyc na tym forum sad.gif




Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 04:18