|
Тема |
Re: честно казано ... [re: unF] |
|
Автор |
salle (един такъв) |
|
Публикувано | 22.02.04 18:29 |
|
|
.. не точно грешка, но имам някои много сериозни забележки към твоя отговор.
Първото е, че човекът не пита за PHP - може примерно от Java да работи или през ODBC и т.н.
Но това да кажем е малък проблем - дал си пример като за PHP
Само, че в твоя отговор има някои много сериозни логически грешки. Ти може и да си ги знаеш, но не е хубаво да даваш такива съвети. Тези които те четат обикновено повтарят едно към едно (направо Copy/Paste) а значи повтарят и грешките ти.
$q = "SELECT * FROM tableName WHERE user = 'abc' AND a = '0' AND b = '0'";
$r = mysql_fetch_object(mysql_db_query($dbname,$q,$dblink));
if ($r->id != 0){
Правиш SELECT * ... когато реално ти трябва само ID
Това е грубо разхищение на ресурси както и да го погледнеш. Само една такава разлика между SELECT * FROM и SELECT ID FROM може да ти забави стотици пъти приложението и да ти изяде огромно количество памет съвсем ненужно.
Това е основно правило не само в базите данни но и изобщо в програмирането. Никога не изисквай нещо което няма да използваш. Независимо дали става въпрос за данни, памет и т.н.
Следващото нещо за което вече си за бой (виртуален )
$r = mysql_fetch_object(mysql_db_query($dbname,$q,$dblink));
if ($r->id != 0){
Викаш mysql_query без да провериш резултата за грешка. Никога не бива да го правиш ама в случая дори не става въпрос за теб.
Даваш съвет на някой друг! Не бива да забравяш, че тези които четат твоя съвет може и нищичко да не разбират. И след това ще идват тук и нявсякъде другаде да питат защо гърми еди как си.
Никак не е случайно, че и най-най-най-простичките примери на php.net изгреждат ето така:
Example 2. mysql_query()
<?php
$result = mysql_query("SELECT my_col FROM my_tbl")
or die("Invalid query: " . mysql_error());
?>
И накрая нещо, което може просто да не знаеш
$q = "SELECT * FROM tableName WHERE user = 'abc' AND a = '0' AND
$q = "INSERT INTO tableName SET user = 'abc', a = '0', b = '0'";
$id = mysql_insert_id();
ako pravilno sym te razbral taka shte stane s nai-mnogo dve .. :)
Това са три заявки а не две
mysql_insert_id();
просто изпраща към сървъра
SELECT LAST_INSERT_ID();
Надявам се да не се разсърдиш иска ми се съветите ми са приятелски.
Колкото до задачката като такава тя наистина е много често срещана, но силно зависи от конкретната структура на таблицата.
Кое е първичния ключ?
Има ли втори уникален ключ или не?
Всички стойности ли се задават в INSERT или някои се оставят по подразбиране?
Има ли AUTO_INCREMENT?
Какво се прави в случай на съществуващ запис? Просто продължаваш нататък или правиш UPDATE на съществуващия?
Има ли проблем с конкурентността? При PHP в 99% от случаите има - може много браузъри едновременно да отворят този скрипт.
С транзакции ли се работи или не?
Има и още подробности. Ако искате може да поразвием темата в различни варианти.
В някои случаи може да се мине с една заявка:
REPLACE INTO
или един синтаксис който го има от 4.1 нагоре
INSERT INTO .... ON DUPLICATE KEY UPDATE ....
в други случаи може да трябват 4 заявки
LOCK ...
SELECT ...
INSERT ...
UNLOCK ...
|
| |
|
|
|