Jump to content
php.lv forumi

Kā uzzināt ieraksta kārtas numuru?


pilots

Recommended Posts

Datubāzē glabājas lietotāju pievienoto foto ieraksti.

 

foto_db piemērs.

 

id | userid | filename
1 | aaa | ...
2 | aaa | ...
3 | bbb | ...
4 | aaa | ...
5 | bbb | ...
6 | bbb | ...
7 | ccc | ...
8 | bbb | ...
9 | aaa | ...

 

Lietotājs "aaa" ir pievienojis 4 attēlus.

Tie ir ar `id` => 1(1), 2(2), 4(3), 9(4)

 

Lietotājs "bbb" ir pievienojis 4 attēlus.

Tie ir ar `id` => 3(1), 5(2), 6(3), 8(4)

 

Lietotājs "ccc" ir pievienojis 1 attēlu.

Tas ir ar `id` => 7(1)

 

*Iekavās norādīts, kurš šis attēls pēc kārtas ir, ko katrs lietotājs pievienojis.

 

Galvenajā lapā tiek izvadīti nejauši atlasīti 3 pievienotie attēli ar saiti uz tiem.

 

SELECT * FROM foto_db ORDER BY RAND() LIMIT 3

 

Ir nepieciešams, lai galarezultātā izvadot šos attēlus,

tiem klāt varētu izvadīt arī skaitli - kurš pēc kārtas tas attēls ir lietotāja albūmā.

 

Vadoties pēc piemēra datubāzes, vēlamais random rezultāts būtu:

 

User:bbb img_id:8 <img src="..."> Nr4<br />
User:bbb img_id:4 <img src="..."> Nr3<br />
User:ccc img_id:7 <img src="..."> Nr1<br />

 

Kā gan šo kārtas skaitli uzzināt?

Link to comment
Share on other sites

Ehh. Stundu domāju kā izklāstīt problēmu, un izskatās ka arī risinājums tik viegli nerodas. :(

 

Redz, saglabājot bāzē numuru, šaubos, ka tas ko atvieglos.

Jo, piemēram, ja lietotājs `aaa` izdzēš attēlu ar id `2` tad iztrūkst viņa galerijā attēls ar kārtas numuru 2. (šķiet vajadzēja precizēt, ka jānoskaidro kārtas numurs pievienotajam attēlam, ņemot vērā, ka ja izdzēš nr2, tad visi nākamie pielāgojas, veidojot nepārtrauktu secību.)

 

Paldies protams par mēģinājumu palīdzēt, un kādam varbūt ir vēl risinājumi?

Edited by pilots
Link to comment
Share on other sites

Pasākums ir visnotaļ ķēpīgs, bet nu mēģināšu pastāstīt, kā to daru es. Došu kodu, kā lietotājam ievietot bildi KONKRĒTĀ pozīcijā. Ja ir vajadzīgs bildi ievietot tikai bilžu saraksta beigās, tad biki pielabo INSERT daļu. Tātad, ieviešam jaunu lauku - foto_pos(integer). Kas mums ir vajadzīs? Pirmkārt, pamainīt kārtas numuru pie izmaiņām datubāzē - INSERT, UPDATE, DELETE.

 

Pieņemu, ka $data[] masīvā glabājas dati, kas ir jāsaglabā datubāzē:

$data['userid'] - lietotājs
$data['filename'] - faila nosaukums
$data['foto_pos'] - pozīcija, kādā šo failu iestādīt

Pozīcija sākas ar 1 un beidzas ar foto_skaitu konkrētam lietotājam.

 

# INSERT
.... šeit kods, kas pievieno jaunu bildi
# pēc veiksmīga INSERTA, pielabojam pozīcijas pārējām bidēm.
# ja bilde vienkārši tiek pievienota bilžu saraksta galā, tad šo daļu var izlaist,
# protams, pirms INSERTA tam dabūjot MAX(foto_pos) WHERE userid = '$data[userid]'

# dabūjam jauno id
$last_id = last_insert_id();
# ideja - visām bildēm, kam pozīcija ir lielāka nekā jaunajai, pamainīt pozīciju + 1
$sql = "UPDATE foto_db SET ".
	"foto_pos = foto_pos + 1 ".
	"WHERE ".
	"foto_pos >= $data[foto_pos] AND ".
	"id != $last_id AND ".
	"userid = $data[userid]";
$db->execute($sql);

 

Visķēpīgākā daļa - UPDEITS

# UPDATE
# dabūjam vecāieraksta datus
$data_old = get_item($data['id']);
.... šeit kods, kas apdeito jaunu bildi
# pēc veiksmīga UPDATE, pielabojam pozīcijas pārējām bidēm.

$sql = '';
# ja mainās lietotājs (šo daļu var izlaist, ja lietotājs nekad nemainīsies)
if($data['userid'] != $data_old['userid'])
{
# vispirms pielabojam pozīcijas vecajam lietotājam
$sql = "UPDATE foto_db SET ".
	"foto_pos = foto_pos - 1 ".
	"WHERE ".
	"foto_pos > $data_old[foto_pos] AND ".
	"userid = $data_old[userid]";
$db->execute($sql);
# šitā daļa principā tādi pati kā pie foto INSERTA
$sql = "UPDATE foto_db SET ".
	"foto_pos = foto_pos + 1 ".
	"WHERE ".
	"foto_pos >= $data[foto_pos] AND ".
	"id != $data[id] AND ".
	"userid = $data[userid]";
} else {
# šeit sākas kods, ja lietotājs NAV mainīts

# ja jaunā pozīcija ir lielāka par veco
if($data['foto_pos'] > $data_old['foto_pos'])
	$sql = "UPDATE foto_db SET ".
		"foto_pos = foto_pos - 1 ".
		"WHERE ".
		"foto_pos >= $data_old[foto_pos] AND ".
		"foto_pos <= $data[foto_pos] AND ".
		"id != $data[id] AND ".
		"userid = $data_old[userid]";
# ja jaunā pozīcija ir mazāka par veco
elseif($data['foto_pos'] < $data_old['foto_pos'])
	$sql = "UPDATE foto_db SET ".
		"foto_pos = foto_pos + 1 ".
		"WHERE ".
		"foto_pos <= $data_old[foto_pos] AND ".
		"foto_pos >= $data[foto_pos] AND ".
		"id != $data[id] AND ".
		"userid = $data_old[userid]";
}
# izdaram izmaiņas
if($sql)
$db->execute($sql);

 

Pie ieraksta izdzēšanas viss atkal ir vienkārši - samazinam foto_pos par 1, visiem ierakstiem, kas bija ar lielāko pozīciju, kā dzēšamajam ierakstam

# DELETE
# dabūjam vecā ieraksta datus
$data = get_item($data['id']);
.... šeit kods, kas izdēš bildi
$sql = "UPDATE foto_db SET ".
"foto_pos = foto_pos - 1 ".
"WHERE ".
"foto_pos > $data[foto_pos] AND ".
"userid = $data[userid]";

$db->execute($sql);

 

Ja ir pieejams MySQL ar trigeriem, iesaku šo kodu pārnest uz trigeriem - būs vienalga ar kādu clientu mainīt pozīcijas.

Edited by marrtins
Link to comment
Share on other sites

es tā saprotu, ka kārtas numuru nosaka sortēšana pēc `id`

	SELECT
	p.`id`, p.`userid`,
		(SELECT
			COUNT(p2.`id`)
		FROM
			`photo` AS p2
		WHERE
			p2.`userid`=p.`userid` AND p2.`id`<=p.`id`
		ORDER BY
			p2.`id` ASC
	) AS position
FROM
	`photo` AS p
 ORDER BY RAND() LIMIT 3

Link to comment
Share on other sites

marrtins, tavs risinājums liktu izmantot papildus lauku, kur glabāt kārtas nr, ko arī varētu darīt, tomēr nemec variants gandrīzvai strādā.

 

Ar nemec variantu ir gan bēda, lai arī kārtas numuru izvada, tomēr ačgārni (no otra gala skaitot).

 

Ja ir 7 bildes un izvada bildi kura ir pirmā, tad kā kārtas numuru izvada 7, ja 6 - tad 2 ..

 

Es mēģinu šobrīd izkost to subkveriju, bet varbūt kāds ātrāk pamana ko pamainīt kodā.

Link to comment
Share on other sites

Urā!

 

WHERE
p2.`userid`=p.`userid` AND p2.`id`<=p.`id`

 

izmainīju uz:

 

WHERE
p2.`userid`=p.`userid` AND p2.`id`>=p.`id`

 

Pieredze iepriekš nav bijusi ar subkverijiem, tādēļ nepārzinu kādas problēmas tas varētu sagādāt. Šeit manis uzdotajam jautājumam ir arī cits piegājiens (sarežģītāks), kuru nepieciešamības gadījumā izskatīšu. Attiecīgais projekts ir uz tīra entuazisma balstīts un bez finansēm, tādēļ šai problēmai patlaban vēlējos vieglāko risinājumu.

 

Tencinu visus, kas dalījās ar padomiem un jo īpaši biedram - nemec.

Link to comment
Share on other sites

  • 6 months later...
×
×
  • Create New...