الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التحديث مرة واحدة فقط

بدأه mancoeg في 25 فبراير 2008 · 5 رد · 1,007 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

لدى جدول به اسماء مثل

ahmed

ali

وهكذا

وايضا لدى ملف نص اسمه any.txt

به اسم فى كل سطر مثل

adel

ahmed

islam

وهكذا

كما تلاحظون هناك اسم مشترك بين الجدول والملف النصى any.txt

مع العلم ان الاسماء التى بداخل الملف متغيره وليست ثابته

الكود اللى انا كاتبه بيعمل الاتى

1- يتم الاتصال بالداتابيز وعمل سيليكت لكل الاسماء التى بداخل الجدول

واخذ كل اسم ومقارنته بالملف النصى any.txt

فان وجد فى الملف اقوم بعمل تحديث لحقل اسمه flag

داخل الجدول السابق واقوم بوضع القيمه 1

اما ان لم يتم ايجاده بمعنى انه الاسم موجود فى الدول وليس موجود بالملف النصى فى تلك اللحظه

فأقوم بوضع القيمة 0 داخل الحقل flag

وكل ده شغال تمام

المشكله بقى انى الكود ده بيعمل تحديث كل شويه للحقل flag

المطلوب هوا ان التحديث يتم مع تغيير حالة اليوزر فقط

وللتوضيح اكثر

مثلا عندى اسم موجود بالجدول وايضا بالملف النصى هنا اللى هيتم ان قيمة حقل ال flag

بتاعته هتبقى واحد

ويخلص اللوب اللى انا عامله ويجى الدور تانى على نفس الاسم السابق وبرده هيتم تحديث الحقل وكتابة نفس القيمة 1

انا بقى مش عايز الخطوة ديه تحصل

بمعنى ان مادام الاسم موجود فى الجدول والملف وتم عمل تحديث مرة مش عايزها تتم تانى

الا لما الاسم ده يتحذف من الملف النصى

اتمنى ان يكون حد فهمنى

شكرا

#2

يبدو ان محدش فهم اللى قولته

#3

السلام عليكم

ياريت لو حد مش فاهم اللى قولته يسألنى وان اوضح

بجد الموضع مهم جدا بالنسبالى

شكرا

#4

?

#5

وضح حتى لو لم يقل لك احد "لم افهم" طالما كما ترى الموضوع شوي فايت ببعضه.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

انا الى فهمته هو ان عندك مشكلة فى الـ performance بسبب انك بتعمل sql queries كتير و احيانا بيكون ملهاش لازمة, فأنت عايز تقللها على قد متقدر.

الحقيقة انت ممكن تعمل الى انت عايزه دة فى عدد 2 من الاستعلامات كأقصى حد, و دة باﻷعتماد على امكانية لقاعدة البيانات بتمكنك من انك تبعت اكثر من قيمة كـ array فى جملة الـ SQL بتاعتك , انا استخدمت هنا كلمة IN و مقابلها NOT IN .

<?php

/**
 * returns the list of names stored in the file
 *
 *@return Array
 */
function getNamesFromFile() {
 //  ... return array('ahmed', 'ali', 'zack', 'sara');
}


/**
 * generates number of place holders used in preparing sql statments
 *
 *@param int	number of place holders needed
 *@return String
 */
function getSqlPlaceHolders($num=1){
$str = '?';

	for($i=1;$i<$num;$i++) {
		$str .= ', ?';
	}

return $str;
}

$namesInFile = getNamesFromFile(); //array ( ... )
$numberOfNames = count($namesInFile)


$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

	if ($numberOfNames > 0) {

		//set flags to 0
		$stmt = $db->prepare('UPDATE table_name
							  SET flag = 0 
							  WHERE name NOT IN (' . getSqlPlaceHolders( $numberOfNames ) . ')');

		for($i=0; $i<$numberOfNames; $i++) {
			$stmt->bindValue($i+1, $namesInFile[$i], PDO::PARAM_STR);
		}

		$stmt->execute();


		//set flags to 1
		$stmt = $db->prepare('UPDATE table_name
							  SET flag = 1 
							  WHERE name IN (' . getSqlPlaceHolders( $numberOfNames ) . ')');

		for($i=0; $i<$numberOfNames; $i++) {
			$stmt->bindValue($i+1, $namesInFile[$i], PDO::PARAM_STR);
		}

		$stmt->execute();

	}else{

		$db->exec('UPDATE table_name
				   SET flag = 0');
	}

لاحظ انا بستخدم هنا PDO بدل من استخدام الطريقة القديمة للتعامل مع MySQL بأستخدام دوال mysql_connect و اخواتها, راجع المنوال للتفاصيل.

مراجع :

====

MySQL : Subqueries with ANY, IN ,and SOME

PHP: PDO - PHP Data Object

Web Citizen

ShrefInLife.gif

__________

General blog : Shref In Life

مواضيع مشابهة