يعمل استعلام Mysqli فقط على مضيف محلي وليس خادم ويب

StackOverflow https://stackoverflow.com/questions/2543324

  •  23-09-2019
  •  | 
  •  

سؤال

لقد غيرت بعض استفساراتي القديمة إلى إطار MySQLI لتحسين الأداء. كل شيء يعمل بشكل جيد على المضيف المحلي ولكن عندما أقوم بتحميله إلى خادم الويب ، فإنه لا يخرج شيئًا. بعد الاتصال ، أتحقق من وجود أخطاء وليس هناك شيء. لقد راجعت أيضًا وحدات PHP المثبتة ويتم تمكين MySQLI.

أنا متأكد من أنه ينشئ اتصالًا بقاعدة البيانات حيث لا يتم عرض أي أخطاء. (عندما غيرت سلسلة اسم قاعدة البيانات ، أعطت الخطأ)

لا يوجد إخراج من الاستعلام على خادم الويب ، والذي يبدو هكذا:

$mysqli = new mysqli("server", "user", "password");

if (mysqli_connect_errno()) {
   printf("Can't connect Errorcode: %s\n", mysqli_connect_error());
   exit;
}

// Query used  
$query = "SELECT name FROM users WHERE id = ?";

if ($stmt = $mysqli->prepare("$query")) 
{

    // Specify parameters to replace '?'
    $stmt->bind_param("d", $id);  

    $stmt->execute();

    // bind variables to prepared statement 
    $stmt->bind_result($_userName);

    while ($stmt->fetch()) 
    {
          echo $_userName;
    }


    $stmt->close();
 }
}

//close connection 
$mysqli->close(); 

كما قلت هذا الرمز يعمل بشكل مثالي على بلدي FacalServer ليس فقط عبر الإنترنت. فحص سجلات الأخطاء ولا يوجد شيء ، لذلك يشير كل شيء إلى اتصال جيد. جميع الجداول موجودة أيضًا وما إلى ذلك. أي شخص أي أفكار لأن هذا قد عالقني! أيضًا ، إذا حصلت على هذا العمل ، فهل ستظل جميع استفساراتي الأخرى تعمل؟ أم سأحتاج إلى جعلهم يستخدمون إطار عمل MySQLI أيضًا؟ شكرا لك مقدما.

تعديل:

حسنًا ، لقد قمت ببعض "تصحيح الأخطاء" لمعرفة ما يحدث. هناك بيانات في الجدول ، أتعلم يطابق الاستعلام. لقد فعلت ما يلي للتحقق من بيان الإعداد:

echo "debug 1";

if ($stmt = $mysqli->prepare("$shiftQuery"))  
{

echo "debug 2";
printf("Error: %s.\n", $stmt->error);

etc...
}

لذلك يجب أن يخرج "Debug 1" في الأساس قبل تحضير الإحصاء (وهو ما يفعله). ثم بعد أن نخرج "Debug 2" وأي أخطاء حدثت.

المشكلة هنا في مكان ما لأنها لا تصل إلى خط Debug 2 في البيان IF. نظرًا لأن تفاصيل الاتصال جيدة ، لا أستطيع أن أرى حقًا سبب إنشاء كائن mysqli $. التي تعطي أي شخص أي أفكار أخرى ؟؟؟

شكرًا

لا يوجد حل صحيح

نصائح أخرى

يمكن أن تفشل كل مكالمة إلى طريقة mysqli/stmt. يجب عليك التحقق من كل واحد.
جربه مع error_reporting (e_all) وربما display_error = on

<?php
error_reporting(E_ALL); ini_set('display_errors', 1);

// passing database name as fourth parameter
$mysqli = new mysqli("server", "user", "password", 'dbname');
if (mysqli_connect_errno()) {
   printf("Can't connect Errorcode: %s\n", mysqli_connect_error());
   exit;
}

// Query used  
$query = "SELECT name FROM users WHERE id = ?";

if ( false===($stmt=$mysqli->prepare("$query")) ) {
  echo 'mysqli::prepare failed: ', htmlspecialchars($mysqli->error);
  die;
}

// Specify parameters to replace '?'
$rc = $stmt->bind_param("d", $id);  
if ( !$rc ) {
  echo 'bind_param failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: execute()</pre>';
$rc = $stmt->execute();
if ( !$rc ) {
  echo 'execute failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: bind_result()</pre>';
// bind variables to prepared statement 
$rc = $stmt->bind_result($_userName);
if ( !$rc ) {
  echo 'bind_result failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: fetch()</pre>';
while ($stmt->fetch()) 
{
  echo 'username: ', $_userName;
}
echo '<pre>Debug: stmt close()</pre>';
$stmt->close();

echo '<pre>Debug: mysqli close()</pre>';
$mysqli->close();

يعد إذن مستخدم MySQL حساسًا للمضيف - قد يعطي المستخدم 1 من LocalHost و user1 من مضيف آخر إذن مختلف.

GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password';

إطار MySQLI لا يحسن الأداء.
يجب إجراء التحقق من الخطأ ليس فقط بعد الاتصال ولكن بعد تنفيذ كل استعلام.

الشيك $stmt->error للأخطاء
أو حاول التحقق من استثناء رمي

هو Id عدد صحيح؟ عادةً ما أدير Mysqli أعجبني

$sql = "SELECT name FROM users WHERE id = ?";
            if($stmt = $mysqli->mysqli->prepare($sql)){
              $stmt->bind_param("i", $id);
                    if($stmt->execute()){
                        $stmt->bind_result($name);
                        $stmt->store_result();
                        if($stmt->fetch()){
                            return $name;
                         }else{
                             return 'Not Found';
                         }      
                    }else{
                        return 'Execute Error';
                    }

            }else{
                return 'SQL Error';
            }

امل ان يساعد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top