Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czy to zadziała?
brandon
post 24.11.2003, 02:54:48
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 7.11.2003

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


Zaczynam kombinować z klasami (ciekawie to wygląda) i zbudowałem sobie takie maleństwo do wstawiania rekordu do tablicy (rzecz jasna jest częścią klasy):

[php:1:90532def57]<?php
function wstaw($tabela, $wartosci)
// wstawia nowe pole do tabeli ($tabela). $wartosci musi być tablicą o ilości parametrów
// równej ilości pól w tabeli.
{
global $baza;
$lista = mysql_list_fields($baza, $tabela);
$ilosc = mysql_numfields($lista);
$max = $ilosc - 1;

if (!is_array($wartosci))
{ return -1; exit;}
else
{ $liczba = count($wartosci);
if ($liczba <> $ilosc)
{ return -2; exit;}
else
{


for ($w = 0; $w <= $ilosc-1; $w++)
{
$nazwy .= mysql_fieldname($lista,$w);
$wart .= $wartosci[$w];
if ($w <> $ilosc-1) { $nazwy .= ", "; $wart .= ", ";};
}
$sql = "INSERT INTO $tabela ($nazwy) VALUES ($wart)";
$result = mysql_query($sql) or die ('Błąd podczas wykonywania zapytania [funkcja "wstaw"].');
return 0;

};
};

}

?>[/php:1:90532def57]

Działa, wstawia tak, jak trzeba. Mam jednak dwa pytania:
1. Jak sądzicie, czy rozwiązanie polegające na wydłubywaniu nazw pól z bazy jest ergonomiczne? Może lepiej byłoby ręcznie podawać pola?
2. Zastosowanie for zamiast foreach jest dobrym rozwiązaniem?
Go to the top of the page
+Quote Post
adwol
post 24.11.2003, 12:58:05
Post #2





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

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


W/g mnie lepiej nie bazować na kolejności i ilości kolumn w tabeli. Jak się zdarzy, że będziesz musiał dodać do tej tabeli jakieś pole wszystko Ci się rozjedzie. Lepiej przekazywać do funkcji hasza z polami:
[php:1:a738cea0db]<?php
function wstaw($tabela, $wartosci)
{
foreach ($wartosci as $k => $v)
if ($v != 'null')
$wartosci[$k] = "'$v'";
mysql_query("insert into $tabela (" . join(', ', array_keys($wartosci)) . ') values (' . join(', ', array_values($wartosci)) . ')';
return 0;
}

wstaw('tabela', array('pole1' => 'wartosc1', 'pole2' => 'wartosc2'));
?>[/php:1:a738cea0db]

Cytat
1. Jak sądzicie, czy rozwiązanie polegające na wydłubywaniu nazw pól z bazy jest ergonomiczne? Może lepiej byłoby ręcznie podawać pola?

Zawsze jest to dodatkowe zapytanie przy każdym wsadzaniu do bazy, więc narzut czasowy jakiś też jest. Z drugiej strony, to zapytanie nie jest znów aż tak czasochłonne bo zwraca wynik ze schematu bazy, a nie z samych danych.
Cytat
2. Zastosowanie for zamiast foreach jest dobrym rozwiązaniem?

Czas wykonania for i foreach jest porównywalny.
Go to the top of the page
+Quote Post
brandon
post 3.12.2003, 13:07:19
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 7.11.2003

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


Dzięki za sugestię. Nie odzywałem się długo, ale projekt, w którym wykorzystam te klasy przesunął się gdzieś na połowę grudnia, z powodu dodatkowych zajęć i czegoś, co nurtuje chyba każdego [cytując Vabank: "Kruca bomba, mało casu..." winksmiley.jpg ].
Go to the top of the page
+Quote Post
stach
post 3.12.2003, 14:07:53
Post #4





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 15.02.2003
Skąd: Ziemia

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


[php:1:96312c1558]<?php
function sql_Insert($result,$tabelka,$wektor,$wektorb,$db,$field)
{
$sql = "INSERT INTO ".$tabelka." (";
for ($i=0;$i<$db->sql_numfields($result);$i++) {
$sql .= $db->sql_fieldname($i, $result);
$sql .= ($i < ($db->sql_numfields($result) - 1)) ? (", ") : ("");
}
$sql .= ") VALUES ('', ";

$j = 0;

for ($i=0;$i<($db->sql_numfields($result) - 1);$i++) {
if ($i != ($db->sql_numfields($result) - 2)) {
$sql .= ($i < ($db->sql_numfields($result) - 2)) ? ($input = (is_array($field) && $field[$j]) ? ($field[$j]."('".$_SESSION[$wektor][$j]."'), ") : ("'".$_SESSION[$wektor][$j]."', ")) : ($input = (is_array($field) && $field[$j]) ? ($field[$j]."('".$_SESSION[$wektor][$j]."'), ") : ("'".$_SESSION[$wektor][$j]."'"));

$j++;
}
if ($wektorb) {
if ($i == ($db->sql_numfields($result) - 2) && $wektorb) {
$sql .= "'".$fmbt = ($_SESSION[$wektorb][0]) ? ($_SESSION[$wektorb][0] . "'") : ("off")."'";
}
}
else {
if ($i == ($db->sql_numfields($result) - 2)) {
$sql .= ($input = (is_array($field) && $field[$j]) ? ($field[$j]."('".$_SESSION[$wektor][$j]."'), ") : ("'".$_SESSION[$wektor][$j]."'"));

$j++;
}
}
}

$sql .= ")";

return ($sql);
} // end func sql_Insert
?>[/php:1:96312c1558]

$db->sql_numfields - pobiera liczbe pol ( mysql_num_fields() )
$db->sql_fieldname - pobiera nazwe pola ( mysql_field_name() )

coprawda narazie jest jeszcze troche "statyczną" funkcja, ale jak narazie sprawdza się .


--------------------
Warsztat: IIS 6.0 | PHP 4.3.10 && 5.0.3 | MySQL 4.1.9 | Smarty 2.6.7 | PEAR | EditPlus 2
Produkcja: FlipTiM
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 - 00:21