Witam, zna ktoś może jakieś polecenie albo funkjce w php która pozwoli na zmiane w jednej kolumnie liter na same duże lub same małe? próbowałem użyć funkcji UPPER ale coś mi nie działało :/
Zależy, gdzie chcesz tę zmianę wprowadzić:
-
w istniejących danych na bazie, to można prostym updatem:
UPDATE tabelka SET atrybut=UPPER(atrybut);
-
Przy wybieraniu wartości z bazy, to można zaaplikować funkcję bazodanową:
SELECT UPPER(atrybut) FROM tabelka WHERE ....
-
W aplikacji -> wspomniana przez @reinman funkcja z php.
-
Czasem można namówić bazę, żeby traktowała wartości jako "case insensitive", ale to zależy od silnika i przypadku użycia.
Najlatwiej i najszybciej to w CSS:
https://developer.mozilla.org/pl/docs/Web/CSS/text-transform
Wykorzystałem funkcję w php od @reinman, dziękuję bardzo za pomoc! a pytanie mam jeszcze co do UPDATE tabelka SET atrybut=UPPER(atrybut)
co w tym poleceniu jest atrybutem?
a jeśli chciałbym ograniczyć wprowadzanie danych tylko dużych liter w <input type="text" name="Nazwa1" value="<?php echo $nzw1; ?">" size=36 maxlength="36"/> w takim polu, to jak miałbym to napisać?
Jeśli nie wiesz, jakie pole masz zmienić, to lepiej się do tego nie zabieraj.Znaczy to, że nie znasz bazy i zależności w niej. Być może wywołasz jakiś trigger...
jednak założenie miało być totalnie inne, posiadając w bazie danych wiersz o takiej treści "DZIAŁ GENERALNEGO PROJEKTANTA - G2" muszę stworzyć funkcję która będzie przerabiać ten tekst na tekst w takiej formie "Dział Generalnego Projektowania - G2" myślałem, czy jest możliwość użycia funkcji "initcap" tylko nie wiem jak wyciąć od prawej G2 do myślnika żeby zostawiał dużymi literami, może "RPAD"?
Jeżeli to jest standardowa budowa (tzn. zawsze jest tylko 1 myślnik) to "wytnij" szukany tekst do zmiany od początku komórki do myślnika np. przy użyciu CHARINDEX()
Coś jak:
INITCAP(LEFT([Nazwa]), CHARINDEX('-', [Nazwa])))
tak, jest tylko jeden myślnik, a jak to zaimplementować w kod php, bo próbuję coś takiego
$nzw1 = INITCAP(LEFT([Nazwa1]), CHARINDEX('-', [Nazwa1]));
No tak jak wyżej już ktoś pisał - całe zapytanie SQL powinno wyglądać:
UPDATE tabelka SET Nazwa=INITCAP(LEFT([Nazwa]), CHARINDEX('-', [Nazwa])))
Pytanie brzmi w ogóle jaka to baza ? Bo Initcap jest np w Oracle ale już w MS SQL nie ..
ciężko mi powiedzieć, bo nie ja to zakładałem, działam na systemie as400
$lowercaseTitle = strtolower($nzw1);
$nzw1 = ucwords($lowercaseTitle);
takie funkcje pozwalaja mi na wyswietlenie tego tak jak potrzebuję, ale nie wiem teraz jak napisac funkcje ktora pozwoli na zostawienie od prawej az do myslnika duzych liter
Drzewko96 napisał(a):
ciężko mi powiedzieć, bo nie ja to zakładałem, działam na systemie as400
Czyli IBM DB2.
dokładnie tak
update macborlib/adr set nazwa1=initcap(left(nazwa1), LOCATE ('-', nazwa1))
a błąd to:
Number of arguments for function LEFT not valid.
ehh no przeciez podajesz 1 argument w LEFT !
update macborlib/adr set nazwa1=initcap(left(nazwa1, LOCATE ('-', nazwa1)))
teraz usunęło mi te końcówki które potrzebowałem z dużej litery ;/
Propouje spędzić więcej czasu na testach i zabawie kodem niż pisaniem od razu tu :| Sprawdź co dostajesz takim zapytaniem ?
SELECT left(nazwa1, LOCATE ('-', nazwa1)) FROM macborlib/adr
Powinieneś mieć tylko treść do myślnika .. jeśli masz całość to może to wcale nie myślnik a inny znak ?
mam tylko treść do myślnika, ale ja potrzebuje rowniez te dane po myślniku mieć, tylko z dużyćh liter, czyli przykładowo, pierwszy rekord brzmi tak Prezes Zarzadu -
a powinno być Prezes Zarządu - PZ
a teraz w bazie zniknęły te wartości po znaku -
przekopiowałem od nowa stara baze i po wpisaniu SELECT left(nazwa1, LOCATE ('-', nazwa1)) FROM macborlib/adr
wyświetla tak samo, tylko do pierwszego myślnika, a reszte zostawia, teraz musze jakos znaleźć sposób jak to obrobić, ale reszte zostawiał dużą
No i OK czyli "wyciąganie" tekstu do zmiany działa jak zakładano. To do tego należy dokleić resztę tekstu z komórki (przy pomocy CONCAT) :
SELECT CONCAT(INITCAP(LEFT(nazwa1, LOCATE ('-', nazwa1))), SUBSTR(nazwa1, LOCATE ('-', nazwa1) +1)) FROM macborlib/adr
Jeśli wyświetli poprawnie tak jak oczekiwano możesz budować UPDATE (jak testujesz zrób na 1 kodzie najpierw).
Edit: Czyli:
CONCAT - łączy strigni
SUBSTR - wyciąga część tekstu z innego tekstu - u Ciebie od myślnika (+1 żeby nie brać znów myślnika) do końca komórki
LEFT - bierze tekst od lwej do myślnika
INITCAP - zmienia wybrany tekst żeby była tylko 1 litera duża
polecenie działa tak jak powinno, a jak zaimplementować to w kodzie php teraz? żeby nie zmieniać w bazie a tylko wyświetlać w takiej formie?
$lewysql ="SELECT CONCAT(INITCAP(left(nazwa1, LOCATE ('-', nazwa1))), SUBSTR(nazwa1, LOCATE ('-', nazwa1) +1)) FROM macborlib/adr where kontob<1000";
$stmt_lewysql = db2_query($conn, $lewysql);
if (!$stmt_lewysql) {
print"Prepare Failed. Blad w odczycie bazy adr <br>";
exit();
}
$row_lewysql = db2_fetch_array($stmt_lewysql);
//echo $sql."<BR>";
$color=0;
while ($row = db2_fetch_array($stmt)) {
//print_r($row);
//print '<br>';
$kntb = $row[0]; //kontoB
$kntj = $row[1]; //kontoJ
$kntd = $row[2]; //kontoD
$nzwskadr = $row[6]; //Nazwisko
$skrnzw = $row[8]; // Nazwa skrócona
$nzw1 = $row_lewysql; // Nazwa 1
$nzw2 = $row[13]; // Nazwa 2
$jdorg =$row[24]; // Jedonstki Organizacyjne
$aktyw =$row[20]; // Czy aktywna?
print '<tr bgcolor='.(($color==0)?'silver':'lightcyan');
$color=($color==0)?1:0;
print '><td align=center><font size=3>'.$kntb.'</a></font></td>';
print '<td align=center><font size=2>'.$kntj.'</font></td>';
print '<td align=center><font size=2>'.$kntd.'</font></td>';
print '<td align=center><font size=2>'.$nzwskadr.'</font></td>';
print '<td align=center><font size=2>'.$skrnzw.'</font></td>';
print '<td align=center><font size=2>'.$nzw1.'</font></td>';
print '<td align=center><font size=2>'.$nzw2.'</font></td>';
print '<td align=center><font size=2>'.$jdorg.'</font></td>';
print '<td>';
Dobrze to zrobiłem?
wywala mi tylko "array" czyli nazwe tablicy :/
a gdy zrobię
$nzw1 =$row_lewysql[0]; //Nazwa1
To wtedy tylko jeden rekord wyświetla :/
próbowałem na każdy sposób i jakoś nie wychodzi :/
edit:
Strone ogarnalem ,teraz walcze z tym aby zrobic update do bazy
pozwolę sobie dodać nowego posta, zamiast edytować tamtego po raz "x" wie ktoś może co w tym poleceniu robię nie tak? wywala mi taki błąd :/
update macborlib/adr set nazwa1=initcap(left(nazwa1, LOCATE ('-',nazwa1))), substr(nazwa1, locate ('-', nazwa1) +1)) where kontob =1
Token ( was not valid. Valid tokens: =.
błąd podświetla "(" po funkcji substr
Próbuje na razie edytować tylko jeden rekord, żeby nie zepsuć całej bazy
Policz nawiasy
próbowałem już również, nadal ten sam problem
update macborlib/adr set nazwa1=initcap(left(nazwa1, LOCATE ('-',nazwa1))), substr(nazwa1, locate ('-', nazwa1) +1) where kontob=1
w takiej wersji rowniez wywala blad
dodaje screen, aby zobrazować jak wygląda błąd
Hmm ... no ale co Ty tu próbujesz zrobić ? Wstawiasz do nazwa1 = obropbiony tekst .... wstawiasz przecinek ... i znów jakiś tekst ?
Brakuje Ci CONCAT na początku... straszny bałagan :|
update macborlib/adr set
nazwa1=CONCAT(initcap(left(nazwa1, LOCATE ('-',nazwa1))), substr(nazwa1, locate ('-', nazwa1) +1))
where kontob=1
Ahhhh, ten nieszczęsny CONCAT, przepraszam bardzo za tak błache dla Was problemy, muszę się zdecydowanie podszkolić :/
zadziałało, dziekuję
To nie kwestia błahych problemów .. tylko Twojego roztrzepania ... dostałeś już wcześniej wszystko zamiast po rzeźbić po sprawdzać - poddajesz się i piszesz tu.
I co gorsza jak dostałeś wcześniej podpowiedź co do funkcji jakich użyć nawet nie po googłałeś co to jest jak się ich używa - a to już jest kicha trochę. Nic to powodzenia w szkoleniu i więcej pracy własnej po podpowiedziach ;)
Temat można zamknąć jak sądzę.
kombinowałem ale chyba nie wystarczająco, musze sie bardziej zmotywować, dziekuje jeszcze raz