سؤال

مرحبًا ، أنا ألعب مع STMT لأول مرة (بالنظر إلى تحويل التعليمات البرمجية الخاصة بي بعد استخدام وظائف MySQLI القياسية من خلال فئة تمديد.

ومع ذلك ، لا يمكنني تشغيلها. أنا أستخدم PHP 5.2.11 و MySQL 4.1.22.

لدي بنية طاولة مثل ذلك:

CREATE TABLE IF NOT EXISTS `tags` (
  `tag_id` smallint(3) unsigned NOT NULL auto_increment,
  `title` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`tag_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

وهنا رمز الخاص بي ، لقد كنت أستخدم http://devzone.zend.com/article/686 و php.net كمراجع.

$mysqli = new mysqli('***','***','***','***');

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$stmt = $mysqli->prepare("INSERT INTO tags (title) VALUES (?)");

$stmt->bind_param('s', $title);

$title = 'test 123';

$stmt->execute();

$stmt->close();

$mysqli->close();

يبدو الأمر بسيطًا بما فيه الكفاية وآمل أن يتم إدراج "اختبار 123" في عمود العنوان مع زيادة TAG_ID AUTO. ولكن بدلاً من ذلك ، يكون العنوان فارغًا (TAG_ID لا يتجزأ كما يفترض المرء).

أي شخص لديه أي أفكار حيث أخطأ؟

=================================================

كما أشار Atli واختباره ، فإنه يعمل على إصدار MySQL من 5 وما فوق. لذلك ربما تكون مشكلة في استخدام إصدار قديم من SQL على الرغم من أن وثائق PHP.NET تقول أن MySQLI "يتيح لك الوصول إلى الوظائف التي توفرها MySQL 4.1 وما فوق".

إذا كان بإمكان أي شخص اقتراح سبب آخر لعدم عمله أو كيفية عمله في بيئتي ، فإن هذا أمر رائع. إذا لم أكن أفترض ، فسأحتفظ بامتداد فئة MySqli لإعداد الاستعلامات وتنظيفها.

هل كانت مفيدة؟

المحلول

لقد اختبرت الرمز الخاص بك على خادم الاختبار الخاص بي وهو يعمل بشكل جيد. (باستخدام PHP 5.3 و MySQL 5.1.37)
لذلك ليس الرمز نفسه ، أو تصميم قاعدة البيانات.

سيكون تخميني الأول هو بعض عدم التوافق مع إصدار MySQL الخاص بك.
يمكنك محاولة استخدام mysqli_stmt :: get_warnings وظيفة لمعرفة ما إذا كانت هناك أي تحذيرات صادرة.

إذا كان ذلك ممكنًا على الإطلاق ، فإنني أوصي بترقية MySQL. الإصدار الذي تستخدمه هو الحصول على قديمة جدا. - كنت سأقوم بتثبيت 4.1 واختبار هذا عليه (فقط للمتعة: P) لكنهم لم يعد لديهم التنزيلات المتاحة بعد الآن.

نصائح أخرى

تحديد العنوان $ قبل استخدامه. يجب عليك تضمين هذا الخط

$title = 'test 123';

قبل

$stmt->bind_param('s', $title);

الرمز الكامل:

$mysqli = new mysqli('***','***','***','***');

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$title = 'test 123';

$stmt = $mysqli->prepare("INSERT INTO tags (title) VALUES (?)");

$stmt->bind_param('s', $title);

$stmt->execute();

$stmt->close();

$mysqli->close();

بدلاً من

$stmt->bind_param('s', $title);

جرب هذا:

$stmt->bindParam(1, $title, PDO::PARAM_STR);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top