[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Какая разница между разным кодом?
freed-master
В Дримвевере при создании соединения с БД и выводе данных из неё, в страницу вставляется такой вот код:
Свернутый текст
PHP
<?php 
$hostname_conect 
"localhost";
$database_conect "site";
$username_conect "root";
$password_conect "";
$conect mysql_pconnect($hostname_conect$username_conect$password_conect) or trigger_error(mysql_error(),E_USER_ERROR); 

if (!
function_exists("GetSQLValueString")) {
function 
GetSQLValueString($theValue$theType$theDefinedValue ""$theNotDefinedValue ""
{
  if (
PHP_VERSION 6) {
    
$theValue get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  
$theValue function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
  
// Код сверху вставляется через require_once

  
switch ($theType) {
    case 
"text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;    
    case 
"long":
    case 
"int":
      
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case 
"double":
      
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case 
"date":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"defined":
      
$theValue = ($theValue != "") ? $theDefinedValue $theNotDefinedValue;
      break;
  }
  return 
$theValue;
}
}

$colname_Recordset "-1";
if (isset(
$_GET['lm_id'])) {
  
$colname_Recordset $_GET['lm_id'];
}
mysql_select_db($database_conect$conect);
$query_Recordset sprintf("SELECT * FROM pages WHERE lm_id = %s"GetSQLValueString($colname_Recordset"int"));
$Recordset mysql_query($query_Recordset$conect) or die(mysql_error());
$row_Recordset mysql_fetch_assoc($Recordset);
$totalRows_Recordset mysql_num_rows($Recordset);

do { echo 
$row_Recordset['content']; }
while (
$row_Recordset mysql_fetch_assoc($Recordset)); 
mysql_free_result($Recordset); 
В результате на экран выводится содержимое таблицы pages из бд site где id соответствует полученному из адресной строки.

Тот же результат при выполнении кода, размер котороко в 2 раза меньше:
Свернутый текст
PHP
<?php
define
("MYSQL_SERVER""localhost"); 
define("MYSQL_DATABASE""site");
define("MYSQL_USER""root");
define("MYSQL_PASSWORD""");

$sql = @mysql_connect(MYSQL_SERVERMYSQL_USERMYSQL_PASSWORD); 
if(!
$sql
    exit(
"Сервер MYSQL не доступен, отображение страницы невозможно."); 
     
$db = @mysql_select_db (MYSQL_DATABASE); 
if(!
$db
    exit(
"База данных не доступна, отображение страницы невозможно."); 
     
@
mysql_query("SET NAMES utf8");

// Код сверху вставляется через require_once

$id = isset($_GET['lm_id'])?$_GET['lm_id']:null;

if (isset(
$id))
{
$qwert mysql_fetch_assoc(mysql_query("SELECT * FROM `pages` WHERE `lm_id`='".$id."'"$sql)) or die(mysql_error());
}

echo(
$qwert["content"]); 
Розталкуйте, пожалуйста, есть ли принципиальное значение какой вариант использовать?



Спустя 1 час, 8 минут, 13 секунд (9.06.2009 - 23:40) kirik написал(а):
Если требуется только "В результате на экран выводится содержимое таблицы pages из бд site где id соответствует полученному из адресной строки.", то второй код правильный, но в нем возможна SQL инъекция.
Вот так будет точнее:
PHP
define('MYSQL_SERVER', 'localhost');
define('MYSQL_DATABASE', 'site');
define('MYSQL_USER', 'root');
define('MYSQL_PASSWORD', '');

$link = mysql_connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD) or exit('Сервер MYSQL не доступен, отображение страницы невозможно.');
mysql_select_db(MYSQL_DATABASE, $link) or exit('База данных не доступна, отображение страницы невозможно.');

mysql_query("SET NAMES utf8", $link);

// Код сверху вставляется через require_once

if(isset($_GET['lm_id']) && is_numeric($_GET['lm_id']))
{
    $query = mysql_query("SELECT `content` FROM `pages` WHERE `lm_id` = {$_GET['lm_id']}", $link) or die(mysql_error());

    if($content = mysql_result($query, 0))
    {
        echo $content;
    }
    else
    
{
        exit('Ничего не найдено');
    }
}
else
{
    exit('Не верный формат ID.');
}

Спустя 15 минут, 1 секунда (9.06.2009 - 23:55) freed-master написал(а):
Спасибо, учту.
Но все же для чего такое нагромаждение в первом варианте?

Спустя 2 часа, 6 минут, 15 секунд (10.06.2009 - 02:02) kirik написал(а):
GetSQLValueString() - это функция, которая фильтрует входящие в запрос данные, все остальное - тоже что и у нас..

Спустя 4 часа, 47 минут, 16 секунд (10.06.2009 - 06:49) freed-master написал(а):
Так какой лучще исрользовать первый или третий и кавычки двойные/одинарные тоже роль играют?

Спустя 49 минут, 20 секунд (10.06.2009 - 07:38) kirik написал(а):
Цитата (freed-master @ 9.06.2009 - 22:49)
Так какой лучще исрользовать первый или третий

В данном случае 3-й симпотичнее выглядит и ничем не уступает 1-му. Но если будет какой-то другой скрипт, где в запросах будет использваться много данных, то проще, мне кажется, использовать первый.

Цитата (freed-master @ 9.06.2009 - 22:49)
и кавычки двойные/одинарные тоже роль играют

Нет, не особо. В одинарных php не ищет заключенных переменных, что снижает время отработки скрипта, но это не столь критично. Главное удобство одинарных кавычек - в них не нужно экранировать двойные (что логично) когда вставляешь html код.

Спустя 5 часов, 57 минут, 24 секунды (10.06.2009 - 13:36) freed-master написал(а):
Используя первый вариант конструкции, следующий код выполнялся правильно - имя класса каждого вставленного тега <td> задовалось в соответствии с полученным mm_id? т.е. только один тег содержал отличный от других класс.
PHP
<?php do { ?>
<td class="<?php if ($mm_id == $row_mm['mm_id']) { echo "menu_on"; } else {echo "menu";} ?>">
<div>
<a href="tamplate.php?mm_id=<?php echo $row_mm['mm_id']; ?>"><?php echo $row_mm['mm_name']; ?></a>
</div>
</td>
<?php } while ($row_mm mysql_fetch_assoc($mm)); 
Используя третий варинт, практически такой же цикл присваивает всем классам одно имя:
PHP
<?php while ($row_mm mysql_fetch_assoc($mm)) { ?>
<td class="<?php if ($mm_id == $row_mm['mm_id']) { echo "menu_on"; } else {echo "menu";} ?>">
<div>
<a href="tamplate.php?mm_id=<?php echo $row_mm['mm_id']; ?>"><?php echo $row_mm['mm_name']; ?></a>
</div>
</td>
<?php 
Пробовал и do while - та же ситуация, только еще и один пустой тег <td> вставляет...

Спустя 5 часов, 32 минуты, 10 секунд (10.06.2009 - 19:08) kirik написал(а):
Цитата (freed-master @ 10.06.2009 - 05:36)
Используя третий варинт, практически такой же цикл присваивает всем классам одно имя

Там не забывай что в третьем варианте из базы достается только поле content. Тоесть чтобы использовать еще поля mm_id и mm_name, то нужно изменить запрос на:
SQL
SELECT `mm_id`, `mm_name`, `content` FROM `pages` WHERE `lm_id` = {$_GET['lm_id']}

Спустя 1 день, 4 минуты, 4 секунды (11.06.2009 - 19:12) freed-master написал(а):
Используя первый вариант конструкции почему то не работает "ON DUPLICATE KEY UPDATE"
PHP
$editFormAction $_SERVER['PHP_SELF'];
if (isset(
$_SERVER['QUERY_STRING'])) {
  
$editFormAction .= "?" htmlentities($_SERVER['QUERY_STRING']);
}

if (isset(
$sid)) {
  
$insertSQL sprintf("INSERT INTO `counter` SET `sid`='".$sid."', `date`='".$d."', `month`='".$m."', `year`='".$y."' ON DUPLICATE KEY UPDATE `sid`='".$sid."'");

  
mysql_select_db($database_conect$conect);
  
$Result1 mysql_query($insertSQL$conect) or die(mysql_error());
}
Или снова что-то напутал?

Спустя 38 минут, 54 секунды (11.06.2009 - 19:51) kirik написал(а):
А зачем ты еще раз выбираешь БД?
Ты используешь не правильный синтаксис INSERT запроса. Тыц

Спустя 27 минут, 53 секунды (11.06.2009 - 20:19) freed-master написал(а):
Так что-ли?
SQL
INSERT INTO counter (sid, date, month, year) VALUES ('".$sid."', '".$d."', '".$m."', '".$y."') ON DUPLICATE KEY UPDATE `sid`='".$sid."', `date`='".$d."', `month`='".$m."', `year`='".$y."'
но тоже не хочет...

Спустя 9 минут, 28 секунд (11.06.2009 - 20:28) kirik написал(а):
Цитата (freed-master @ 11.06.2009 - 12:19)
INSERT INTO counter (sid, date, month, year) VALUES ('".$sid."', '".$d."', '".$m."', '".$y."') ON DUPLICATE KEY UPDATE `sid`='".$sid."', `date`='".$d."', `month`='".$m."', `year`='".$y."'

date - ключевое слово в MySQL, и если у тебя есть такое поле, это слово должно заключаться в обратные кавычки `date`.
Еще.. Зачем ты обновляешь sid, если он у тебя уникальный и работает на ON DUPLICATE KEY UPDATE?
И еще.. Если ты обновляешь все поля, используюя ON DUPLICATE KEY UPDATE, то не проще-ли воспользоваться REPLACE?

SQL
REPLACE INTO `counter` (`sid`, `date`, `month`, `year`)
VALUES
('".$sid."', '".$d."', '".$m."', '".$y."')

Спустя 30 минут, 31 секунда (11.06.2009 - 20:59) freed-master написал(а):
Благодарю!!!
Конечно это проще, но как об этом узнать если ты об этом даже не догадываешься?... я не только про SQL...

Читить документации.... вариант, но они очень большие, их много и тратить на них уйму времени не очень хочеться учитывая то что я не ставлю перед собой цели стать супер программистом....

Еще раз спасибо!

Спустя 2 часа, 30 минут, 20 секунд (11.06.2009 - 23:29) kirik написал(а):
Цитата (freed-master @ 11.06.2009 - 12:59)
Конечно это проще, но как об этом узнать если ты об этом даже не догадываешься?


Это и называется "опытом" smile.gif
Но доки в любом случае нужно читать, какими бы большими они не были (эт я не только про программирование).


_____________
Всем, кто заинтересован, могу помочь начать зарабатывать на forex.
Пишите в личку или на e-mail: flash-dirt@yandex.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.