Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy to zadziała?
Forum PHP.pl > Forum > PHP
brandon
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?
adwol
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.
brandon
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 ].
stach
[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ę .
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.